Unixで以下のコードの意味が必要で、先に進むのに役立ちます..
`awk -F "|" '{!a[$1]++}{printf RS $1}{print FS $2}' input.txt`
私のサンプル i/p ファイルは以下のようなものです
1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh
以下のようなo/pが必要です
1|Balaji|Kumar|Dinesh 3|India|China|Australia
Unixで以下のコードの意味が必要で、先に進むのに役立ちます..
`awk -F "|" '{!a[$1]++}{printf RS $1}{print FS $2}' input.txt`
私のサンプル i/p ファイルは以下のようなものです
1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh
以下のようなo/pが必要です
1|Balaji|Kumar|Dinesh 3|India|China|Australia
あなたの質問の awk 行については説明しません。あまり意味がないからです:
このワンライナーを試してください:
awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)}
END{for(x in a) printf x"|"a[x]" ";print ""}' file
あなたの例で:
kent$ echo "1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh"|awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)}END{for(x in a) printf x"|"a[x]" ";print ""}'
1|Balaji|Kumar|Dinesh 3|India|China|Australia
終了スペースがあることに注意してください。これは END ループで削除できます。
驚くべきことに、それは簡単に変更できます。その中に !a[$1]++ が書かれている理由がわかりません。
awk -F "|" '{printf RS $1}{print FS $2}' input.txt
最初に改行であるレコード区切り記号、次に最初のフィールドである $1、次に「|」であるフィールド区切り記号を出力します。次に、2 番目のフィールド $2 と改行 (ステートメントが print であるため。printf が使用されている場合、改行は印刷されません)。
あなたのコメントに基づいて、以下が機能するはずです:
awk '{
for(i=1;i<=NF;i++){split($i,a,"|");
b[a[1]]?b[a[1]]=b[a[1]]" "a[2]:b[a[1]]=a[2]
}
for(j in b)printf j"|"b[j]" ";
print"";}' your_file