Linux

如何提取以相同的前 2 個字元開頭的行,然後輸出到單獨的文件?

  • January 10, 2018

我有一個非常大的文本列表,需要一種方法來提取以相同 2 個字元開頭的行,然後將這些行保存到以這 2 個字元命名的單獨文件中。

範例列表:

abWEye7kgw7  
abff34ZSrZf  
abke8mzMyma  
b2R5mPZGbCb  
b2zhhCeLZzZ  
b2q2T5rkACp  
k9ekzbc8nUh  
k9QzXBUrNT7  
k92RtdXntZ3  
vrTtR9GmbWG  
vraVM9QXWzY  
vrME9QnksBf  

期望的輸出:

ab* > ab.txt  
b2* > b2.txt  
k9* > k9.txt  
vr* > vr.txt

該列表相當大,並且有很多前 2 個字元組合。

$ awk '{ f = substr($0,1,2) ".txt"; print >f }' file.in

$ ls
ab.txt  b2.txt  file.in k9.txt  vr.txt

$ cat ab.txt
abWEye7kgw7
abff34ZSrZf
abke8mzMyma

這顯然也可以在 shell 中解決,但awk更適合解析文本文件。選擇substr()輸入文件中每行的前兩個字元,並將其分配給變數f.txt添加到末尾。會將目前print行輸出到名稱為 in 的文件中f

我相信您可以取消f變數並substr()直接在 之後使用表達式>,但不能在awk我在 OpenBSD 上使用的實現中使用(這可能是一個錯誤)。


如果兩個第一個字元的不同組合的數量太多,您可能會遇到打開文件過多的問題。

以下變體將解決這個問題:

awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in

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