Text-Processing
用分隔符分割一行
我有一個空格分隔的文本文件,例如
text1a text2a id1 text4a text5a text1b text2b id2 text4b text5b text1c text2c id3,id4 text4c text5c text1d text2d id5,id6,id7 text4d,text4di text5d
該文件長約 150 萬行。
有些行有兩個 id,用逗號分隔,例如範例中的第 3 行。當嘗試將文件與另一個 id 可能是
id3
或id4
.我想找到第 3 列中存在逗號的所有實例,並將兩邊的任何內容分隔成單獨的行,例如上面的文件將變成。
text1a text2a id1 text4a text5a text1b text2b id2 text4b text5b text1c text2c id3 text4c text5c text1c text2c id4 text4c text5c text1d text2d id5 text4d,text4di text5d text1d text2d id6 text4d,text4di text5d text1d text2d id7 text4d,text4di text5d
有些行包含 3 個或更多逗號分隔的 id。逗號可以出現在其他列中,但它們應該保持原樣。順序無關緊要,例如 id3 或 id4 在文件中是否排在第一位。
我對等方面相當缺乏經驗
awk
,sed
我認為這是完成這項工作的最佳工具。有人能指出我正確的方向嗎?
$ awk 'split($3,f,/,/)>1{for (i=1; i in f; i++) {$3=f[i]; print} next } 1' file text1a text2a id1 text4a text5a text1b text2b id2 text4b text5b text1c text2c id3 text4c text5c text1c text2c id4 text4c text5c text1d text2d id5 text4d,text4di text5d text1d text2d id6 text4d,text4di text5d text1d text2d id7 text4d,text4di text5d
上面保留了 $3 中列出的 id 的順序,如果不希望這樣做,那麼您可以
for (i in f)
代替for (i=1; i in f; i++)
.如果 split() 返回大於 1,則僅執行包含分配 $3 的循環的塊比無條件執行分配更有效,因為每次分配給欄位時,都會強制 awk 重建目前記錄,用 OFS 替換所有 FS。