Awk

根據值列中的文本在具有不同列的文件中引入換行符

  • June 25, 2020

我想根據第一列中的值在具有不同列的文件中引入換行符。

例如:

輸入文件:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800
1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466
1b0y HETATM SF4 A  87
1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

所需輸出:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

我嘗試了 csh 腳本,但沒有成功。

#! /bin/csh
set bin = /home/x/bin

foreach i (`cat pdb_ligands | awk '{print $1}'`)
       echo $i
       sed "s/$i/&\n\n/" pdb_ligands > output.txt
end
$ awk 'NR > 1 && $1 != prev { print "" } { prev = $1 }; 1' pdb_ligands
1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

這將跟踪 中上一行的第一列中的內容prev

如果目前第一列不同於prev,並且我們不在文件的第一行,則列印一個換行符。然後無條件列印所有行。


上面程式碼中的替代方法print ""是 do $0 = ORS $0,它將換行符(或任何ORS設置為輸出記錄分隔符的 )添加到目前記錄的開頭。

這將在稍後列印該行時產生額外的換行符。

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