2013-10-24 45 views
0

較小我有以下形式的數據:刪除的數值其比前述值

 1  "there" 
     ... 
     23489 "abc" 
     23490 "hello" 
     23491 "hi" 
     2  "def" 
     23492 "stackoverflow" 

我想刪除所有這些從一個數值,其小於前述數值開始的行(即我想刪除:2「高清」爲2 < 23491數字)

我希望我的最終輸出看看以下形式:

 1  "there" 
     ... 
     23489 "abc" 
     23490 "hello" 
     23491 "hi" 
     23492 "stackoverflow" 

我知道我可以這樣做編程方式使用像python的編程語言..但是有可能使用像sed,grep等一些Linux命令做同樣的事情

編輯:問題的解決方案非常優雅。是否也可以用本解決方案將字符串的長度(在第二列中)限制爲3。即我想我的輸出看以下表格:

 1  "the" 
     ... 
     23489 "abc" 
     23490 "hel" 
     23491 "hi" 
     23492 "sta" 

感謝和抱歉編輯

回答

2

使用awk你可以說:

awk '{if ($1<prev){next}}{prev=$1}1' inputfile 

您的輸入,它會返回:

$ awk '{if ($1<prev){next}}{prev=$1}1' inputfile 
1  "there" 
23489 "abc" 
23490 "hello" 
23491 "hi" 
23492 "stackoverflow" 

prev=$1保持在可變prev在第一列的值。 if ($1<prev){next}檢查第一列是否小於先前存儲的值,然後移至下一行else print(1)。

編輯:要限制在第二列中的字符串的長度,你可以說:

awk '{if ($1<prev){next}}{prev=$1; gsub("\"", "", $2); $2=substr($2,0,3);$2="\""$2"\""}1' inputfile 
+0

啊,這是一個甜蜜的解決方案:) – netbrain

+0

@devnull非常感謝您的幫助。如果可能的話,你可以請解釋一下..請使用 –

+0

@AliceEverett添加上面的解釋。 – devnull

0

你也許可以使它與此腳本,(沒有測試,但這樣可能需要改變)工作。

#!/bin/bash 
PV="0" 
for l in (data.txt) 
do 
    CV=$(echo $l | sed "s/[^[0-9]+]//g") 
    if [ "$CV" -gt "$PV" ] 
    then 
     echo "${l}" 
    fi 
    PV=$CV 
done