Text-Processing

刪除不超過或少於“N”個欄位的行?

  • June 1, 2017

我正在使用 sed、perl、awk、bash..

我有一個很大的(10GB)文本文件,它有 13 個欄位(列)的TAB分隔數據。不幸的是,其中一些行有 extraneous TABs,所以我想刪除我們有 extra 的整行 TABs,因此不相等的欄位。(我不介意完全丟棄這些線條)

我目前擁有的將欄位數寫入另一個文件。

awk -F'\t' '{print NF}' infile  > fieldCount

head fieldCount
13
13
10
13
13
13
14
13
13
13

我想建構一個簡短的腳本,刪除任何(從原始文件中)多於(或少於)13 個正確欄位的行。

  1. 速度很有幫助,因為我必須對多個文件執行此操作
  2. 一口氣完成會很酷
  3. 我目前正在將 fieldCount 文件移植到 Python 中,嘗試逐行載入。

編輯:

有效(13 列)

a       b       c       d       e       f       g       h       i       j       k       l       m

無效(14 列)

a       b       c       d       e       f       g       h       i       j       k       l       m       n

你幾乎已經擁有它:

awk -F'\t' 'NF==13 {print}' *infile* > *newfile*

而且,如果您使用的是通過擊鍵(:))收費的系統之一,您可以將其縮短為

awk -F'\t' 'NF==13' *infile* > *newfile*

要在一次掃描中執行多個文件,並實際更改文件(而不僅僅是創建新文件),請辨識未使用的文件名(例如,scharf),然後執行循環,如下所示:

對於*列表中的 f*
做
awk -F'\t' 'NF==13 {print}' "$f" > scharf && mv -f -- scharf "$f"
完畢

*list*可以是一個或多個文件名和/或萬用字元文件名擴展模式;例如,

對於 f in blue.data green.data *.dat orange.data red.data /ultra/violet.dat

該命令用臨時文件(僅包含輸入文件中的行和 13 個欄位)mv覆蓋輸入文件(例如, )。(確保這是您想要做的,並且要小心。為了安全起見,您可能應該先備份您的數據。)即使輸入文件已經存在,也要覆蓋輸入文件。如果您的任何文件的名稱以.blue.data``scharf``-f``mv``--``-

引用自:https://unix.stackexchange.com/questions/151658