Linuxのファイルには、タブ区切りの大きな行列があります。
Name ID ABC12 ABCD12 ABCD123 ABCD1234
ABC12 123456 XX YY ZZ JJ
ABC12 123456 XX YY ZZ JJ
ABCD12 123456 XX YY ZZ JJ
ABCD12 123456 XX YY ZZ JJ
ABCD123 123456 XX YY ZZ JJ
ABCD123 123456 XX YY ZZ JJ
ABCD1234 123456 XX YY ZZ JJ
ABCD1234 123456 XX YY ZZ JJ
この行列を最初の列の一致に基づいて別々のファイルに分割したいと思います。 [このファイルは容量が大きく、列数をカウントできません。]
予想出力:
ファイル1;
Name ID ABC12
ABC12 123456 XX
ABC12 123456 XX
ファイル2;
Name ID ABCD12
ABCD12 123456 YY
ABCD12 123456 YY
ファイル3;
Name ID ABCD123
ABCD123 123456 ZZ
ABCD123 123456 ZZ
ファイル4;
Name ID ABCD1234
ABCD1234 123456 JJ
ABCD1234 123456 JJ
ベストアンサー1
十分アッ解決策:
awk 'NR==1{ len=split($0,a_pos); for(i=1;i<=len;i++) a_keys[a_pos[i]]=i }
NR>1{ if(!r[$1]++) { fn="file"++c; print "Name\tID\t"$1 > fn }
print $1,$2,$(a_keys[$1]) > fn
}' OFS='\t' file
len=split($0,a_pos)
- 最初の行を「キー」配列(整数a_pos
でインデックス付けされた配列)に分割します。for(i=1;i<=len;i++) a_keys[a_pos[i]]=i
- 文字列キーでインデックスを付ける配列に反転a_pos
(追加処理のため)a_keys
fn="file"++c
- 構成ファイル名
結果を見る:
for f in file[0-9]*; do (echo "$f"; cat "$f"; echo); done
出力(file1
、file2
および連続file3
タイプfile4
):
file1
Name ID ABC12
ABC12 123456 XX
ABC12 123456 XX
file2
Name ID ABCD12
ABCD12 123456 YY
ABCD12 123456 YY
file3
Name ID ABCD123
ABCD123 123456 ZZ
ABCD123 123456 ZZ
file4
Name ID ABCD1234
ABCD1234 123456 JJ
ABCD1234 123456 JJ