-1

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
4

3 に答える 3

2

あなたの質問の awk 行については説明しません。あまり意味がないからです:

  • 配列 a[] を作成しましたが、決して使用しません
  • RS、FSの間違った使い方

このワンライナーを試してください:

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 ループで削除できます。

于 2013-08-23T08:38:22.907 に答える
1

驚くべきことに、それは簡単に変更できます。その中に !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
于 2013-08-23T07:12:30.640 に答える