2012-10-01 62 views
1

我想從文本文件中刪除所有包含空白字段的行。如何更改以下代碼以直接對文件進行更改?如何使用sed或awk刪除所有包含空白字段的行?

awk '!/^\t|\t\t|\t$/' *.txt  

AD 125.9 MN 124.9 
AC 38.9  VG 13.2 
AV 34.6  BG 33.0 
GL 126.2 
CY 34.9  
CY 44.9  

所需的輸出

AD 125.9 MN 124.9 
AC 38.9  VG 13.2 
AV 34.6  BG 33.0 
+0

你主要是要求如何改變就地文件?檢查這裏:http://stackoverflow.com/questions/3979548/in-place-processing-with-grep – benroth

+0

什麼是在您的上下文中的「空白字段」?請提供您的輸入和所需輸出的例子。 – 2012-10-01 07:29:45

+1

@Tichoderma我編輯了我的問題。 – user1606106

回答

3

使用GNU sed的一種方法:

sed -n -s -i '/[^ \t]* [^ \t]* [^ \t]* [^ \t]/p' *.txt 

結果:

AD 125.9 MN 124.9 
AC 38.9  VG 13.2 
AV 34.6  BG 33.0 
+0

非常感謝您的回答。您的代碼可以正確地使用給定的示例。但是,當它與我的原始文件一起使用時,它將刪除文件中的所有行。是否有其他任何選項? – user1606106

+0

@ user1606106:此代碼禁止使用「-n」標誌進行打印。它將文件分開考慮,而不是與'-s'標誌一起連續流,並使用'-i'標誌編輯文件。當它找到一個包含四個非空字段或更多的行時,它將打印它們。因此,如果您的原始文件沒有四個或更多字段,則它們將被清空。如果你能夠將一些原始文件和一些預期的輸出上傳到[dropbox](https://www.dropbox.com/)或[mediafire](http://www.mediafire.com/ ),也許我可以幫助你。 – Steve

0

你可以使用一個for循環與你原來的awk命令:

for f in *.txt 
do 
    cp $f /tmp/mytempfile 
    awk '!/^\t|\t\t|\t$/' /tmp/mytempfile > $f 
done 
0

使用您輸入這可能工作(但是這取決於是否有空格或標籤):

sed '/^.\{13\}\s/d' INPUTFILE 

或這樣的:

awk 'substr($0,14,1) = " " { print }' INPUTFILE 
+0

我試過所有的答案,他們都沒有工作。我需要直接對文件進行更改,而不是打印輸出。 – user1606106

+0

@ user1606106將'-i'標誌添加到'sed'選項。 'awk'不能做那個afaik。 – Bernhard

+0

@Bernhard我試了-i旗幟。但它不起作用。 – user1606106

8

替代AWK一行代碼:

awk 'NF==4' yourFile 
0

假設你的文件有4場的最大:

awk '{for(i=1;i<5;i++){if($i=="")next;}print}' file_name 

如下測試:

> cat temp 
AD  125.9 MN  124.9 
AC  38.9  VG  13.2 
AV  34.6  BG  33.0 
GL  126.2 
CY  34.9 
CY  44.9 
>awk '{for(i=1;i<5;i++){if($i=="")next;}print}' temp 
AD  125.9 MN  124.9 
AC  38.9  VG  13.2 
AV  34.6  BG  33.0 
> 
+0

非常感謝您的回答。我不需要打印輸出。我想直接對原始文件進行更改。 – user1606106

相關問題