2017-02-13 61 views
0

輸入文件看起來像刪除「0」或「1」從每一行的末尾,除了第一行

Kick-off team 68 0 
Ball safe  69 1 
Attack   77 8 
Attack   81 4 
Throw-in  83 0 
Ball possession 86 3 
Goal kick  100 10 
Ball possession 101 1 
Ball safe  114 13 
Throw-in  123 9 
Ball safe  134 11 
Ball safe  135 1 
Ball safe  137 2 

並在結束它應該是這樣的:

Kick-off team 68 0 
Attack   77 8 
Attack   81 4 
Ball possession 86 3 
Goal kick  100 10 
Ball safe  114 13 
Throw-in  123 9 
Ball safe  134 11 
Ball safe  137 2 

我的解決方案是

awk '{print $NF}' test.txt | sed -re '2,${/(^0$|^1$)/d}' 

我該如何直接更改文件,例如sed -i?

+0

這一項就解決了。感謝所有的建議! – calabash

回答

2
sed -i '2,$ {/[^0-9][01]$/d}' test.txt 
  • 2,$線作用於其上,這一個說第二線路從過濾線結束文件
  • {/[^0-9][01]$/d}的,刪除那些01結束
    • '2,$ {/ [01]$/d}'還可以用於如果最後一列之前的字符總是空格


隨着awk這列的操作更適合:

awk 'NR==1 || ($NF!=1 && $NF!=0)' test.txt > tmp && mv tmp test.txt 
  • NR==1第一線
  • ($NF!=1 && $NF!=0)最後一列不應該是01
    • 也可以使用$NF>1如果最後一列只有非負數
  • > tmp && mv tmp test.txt保存輸出到臨時文件,然後將其移回原來的文件
  • 隨着GNU awk,有就地選擇awk -i inplace 'NR==1 || ($NF!=1 && $NF!=0)' test.txt
+0

這很接近我的。我會用這個。非常感謝 – calabash

+0

你可以用'$ NF!〜/^[01] $ /'替換'($ NF!= 1 && $ NF!= 0)'。 –

+1

@JamesBrown是的,但爲什麼使用正則表達式,如果比較工作;) – Sundeep

1

這裏是我拿到這個。

sed -i.bak -e '1p;/[^0-9][01]$/d' file.txt 

的sed腳本打印第一線,然後刪除匹配您所描述的模式的所有後續行。這假設你的第一行將是刪除的候選人;如果在最後一個字段中包含0或1以外的內容,則此腳本將打印兩次。 -i選項告訴sed就地編輯(使用備份文件)。

awk沒有就地編輯文件的等效選項 - 如果您需要這種功能,您需要在awk腳本的shell包裝中實現它,如@sundeep建議的那樣。

請注意,我沒有使用GNU sed,但這個命令應該和它一樣好。

+0

謝謝,效果很好。 – calabash

+0

太棒了,很高興我能幫到你! :-)如果這個答案是最適合你的答案,請隨時點擊答案左側的複選標記。 – ghoti

0

這可能爲你工作(GNU SED):

sed -i '1b;/\s[01]$/d' file 

除了第一行,刪除01結束的任何行。

1

awk來救援!

$ awk 'NR==1 || $NF && $NF!=1' file 

以上隱祕

$ awk 'NR==1 || $NF*($NF-1)' file