2016-02-12 81 views
-1

我正在尋找一種方法,通過bash從非常大的txt文件中刪除多行模式。刪除以「0」結尾的行。在以「0」結尾的行之後。

我有這樣的人行:

1;alias;1.872198312 
    2;alias;0. 
    3;alias;0. 
    4;alias;2.982193126 
    5;alias;1.987502017 
    6;alias;0. 
    7;alias;0.802829100 
    8;alias;0. 
    9;alias;0. 
    10;alias;0. 
    11;alias;0. 
    12;alias;1.7210172 

我想這個文件轉換成類似:

1;alias;1.872198312 
    2;alias;0. 
    4;alias;2.982193126 
    5;alias;1.987502017 
    6;alias;0. 
    7;alias;0.802829100 
    8;alias;0. 
    12;alias;1.7210172 

從而降低了文件的大小。

我已經嘗試了grep的方法:

grep '0.$^[a-zA-Z0-9.;_]0.$' file.txt 

沒有成功。

回答

2

您可以通過使用awk得到它:

awk -F';' '{if ($NF == "0.") if (!z) z=1; else next; else z=0} 1' file 

輸出:

1;alias;1.872198312 
2;alias;0. 
4;alias;2.982193126 
5;alias;1.987502017 
6;alias;0. 
7;alias;0.802829100 
8;alias;0. 
12;alias;1.7210172 
+0

感謝您的建議。如果我嘗試運行這個命令,我只是得到一個空白輸出。也許有些東西搞亂了文本編碼。 – jetstream

+0

ok試試這個命令:'awk -F';' '{if($ NF + 0 == 0)if(!z)z = 1;其次;其他z = 0} 1'文件' – anubhava

+0

感謝您的解決方案,但它仍然無法正常工作......它只選擇線路。 – jetstream

1

隨着SED:

$ sed '/0\.$/{:a;N;/0\.$/s/\n.*$//;ta}' infile 
    1;alias;1.872198312 
    2;alias;0. 
    4;alias;2.982193126 
    5;alias;1.987502017 
    6;alias;0. 
    7;alias;0.802829100 
    8;alias;0. 
    12;alias;1.7210172 

評論:

/0\.$/ {    # If a line ends with '0.' 
    :a    # Label to branch to 
    N     # Append next line to pattern space 
    /0\.$/s/\n.*$// # If that next line ends with '0.', remove it 
    ta    # If we made a substitution, branch to label 
} 

要使用帶BSD sed的單線程,在ta之後必須有額外的;

+0

感謝您的建議,但我無法完成工作。 sed:1:「/0\.$/{:a;N;/0\.$/s/\n。...」:意外的EOF(正在等待)' – jetstream

+0

@jetstream另外, ;'在'ta'之後插入?當你把命令放在新行上時,如在註釋示例中,可能沒有註釋和縮進?它在POSIX兼容模式下以單線形式工作。 –

1

Perl的溶液:

perl -ne 'print if ! ($skipnext = /;0\.$/) || ! $skip; $skip = $skipnext;' input 
  • -n讀取由線輸入線。
  • /;0\.$/是一個正則表達式。它匹配分號,零,點,行尾。
  • !是否定。
+0

非常感謝。它實際上工作在一個測試文件中,但我無法設法在原始文件(1.5GB)上工作:它保留了多個「0」。結束行。 編輯:它似乎有處理大文件的問題...我一直在嘗試。 – jetstream

+0

文件大小無關緊要。 ''''後面可能有空格? – choroba

+0

也許,但我不確定。我怎樣才能考慮可能的空間?例如0。______ $ – jetstream