列 1 に基づいて同じファイルの複数行をマージします。

列 1 に基づいて同じファイルの複数行をマージします。

私はまだプログラミングを学んでおり、多くのことを試しましたが、フォーマットを正しく指定できません。私タブ区切りファイルには17個の列と多数(約50,000個)の行があります。ファイルは最初の列に基づいてソートされます。同じ最初の列(A)を持つ行をマージしたいのですが、他の16列はすべて異なり、すべての情報を1行、好ましくは同じ列に保持したいと思います。セミコロン;それらの間の区切り文字として。出力ファイルでタブ文字を区切り文字として保持したいと思います。答えてくれてありがとう。私がどこで間違っているかを説明してください。 :)

私が今まで試したこと:

awk -F'\t' 'NF>1{a[$1] = a[$1]";"$2}END{for(i in a){print i""a[i]}}' filename.txt

perl -F',' -anle 'next if /^$/;$h{$F[0]} = $h{$F[0]}.", ".$F[1];
END{print $_,$h{$_},"\n" for sort keys %h}' filename.txt

ファイル形式(残りの15列はB列と形式が同じです)

A     B     C    
123   fvv   ggg
123   kjf   ggg
123   ccd   att
567   abc   gst
567   abc   hgt
879   ttt   tyt

私が望む出力(17列すべてが必要で、2〜16列にはB列とC列と同じ出力が必要です)。 BのすべてのケースはBの下にあり、CのすべてのケースはCの下になければならず、DのすべてのケースはDの下になければなりません。したがって、出力には入力と同じ17列があり、最初の列(この特定のファイルの場合)に多くの反復があるため、50,000行ではなく約20,000行が必要です。

A     B                C
123   fvv;kjf;ccd      ggg;ggg;att
567   abc;abc          gst;hgt
879   ttt              lll

ベストアンサー1

awk '{
      if(NR!=1){a[$1]=$2";"a[$1]}
      else print $0}
    END{
      n = asorti(a, b);
      for (n in b) {
      print b[n],a[b[n]]
      }
    }'

おすすめ記事