![データを転置するファイル処理 [閉じる]](https://linux33.com/image/12157/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BB%A2%E7%BD%AE%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%87%A6%E7%90%86%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
次のIDと名前を含むファイルがあります。
1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde
以下のように、各名前に一致するIDを持つ別のファイルに出力を取得する必要があります。
ファイル1:
abc
1234
5678
1213
ファイル2:
cde
1234
9101
1213
ファイル3:
Klm
9101
1213
ファイル4:
fgh
1234
9101
答え1
問題は、2番目、3番目、4番目、..nフィールドのすべての文字列に対してその文字列で始まるファイルを作成し、最初のフィールド文字列に表示されるすべての行を一覧表示することを前提としています。
$ awk -F\| '{
for(i=2; i <= NF; i++){
if(!a[$i]){ a[$i] = "file_" ++f; print $i > a[$i] }
print $1 > a[$i];
}
}'
1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde
^D
$ for f in file_*; do echo === $f ===; cat $f; done
=== file_1 ===
abc
1234
5678
1213
=== file_2 ===
cde
1234
9101
1213
=== file_3 ===
fgh
1234
9101
=== file_4 ===
ijk
5678
=== file_5 ===
lmn
5678
=== file_6 ===
klm
9101
1213
答え2
awk -F '|' '
{
for(i = 2; i <= NF; i++)
print $1 > $i;
}
' yourFile.txt
スクリプトは、別の列のすべてのファイル名に最初の列を書き込みます。
詳細:
-F '|'
フィールド区切り記号をパイプ文字に設定for(...)
2列から最後の列までprint $1 > $i
列名を持つファイルに列1の内容を書き込みます。i
答え3
IDをどこで入手したのかわからない。
しかし、持っていると仮定すると、次のように試すことができます。
for id in abc cde klm fgh; do
awk -F'|' -v id=$id 'BEGIN{print id} $0 ~ id { print $1; }' test > $id
done