awkを使用して同じ行の重複値を削除するには?

awkを使用して同じ行の重複値を削除するには?

同じ行から重複した列/フィールドを削除したいと思います。試してみましたが、入れ子になったループ、条件ステートメント、および配列を含む長いコードが機能しない結果が出ました。

  • 入力データ:
    1 2 3 4
    1 2 3 1
    1 2 1 3
    4 4 3 2
    3 3 3 2
    1 1 1 1
    5 2 2 7
    
  • 希望の出力:
    1 2 3 4
    1 2 3 
    1 2 3
    4 3 2
    3 2
    1
    5 2 7
    

答え1

使用awk:

awk '{
    for(i=1; i<=NF; i++)
        printf "%s", (!seen[$i]++? (i==1?"":FS) $i: "" )
    delete seen; print ""
}' infile

答え2

awk '{
    for (i=1; i<=NF; i++) {
        if ( !seen[NR,$i]++ ) {
            printf "%s%s", (i>1 ? OFS : ""), $i
        }
    }
    print ""
}' file
1 2 3 4
1 2 3
1 2 3
4 3 2
3 2
1
5 2 7

答え3

awk '
{
  split($0,a); $0=""
  for (i=j=1; i in a; i++)
    if (!(index(FS $0 FS,FS a[i] FS)))
      $(j++) = a[i]
}1' file

出力:-

1 2 3 4
1 2 3
1 2 3
4 3 2
3 2
1
5 2 7

perl -lane 'my %h;
  print join $", grep { !$h{$_}++ } @F;
' file

GNU sedを使用して拡張正規表現モードをオンにします-E

sed -Ee '
  s/.*/ & /;ta
  :a
    s/( (\S+) (.* )?)\2 /\1/
  ta
  s/ (.*) /\1/
' file

答え4

ほとんど他の答えと似ていますが、「現在のレコード」を書き直し、1最後にそのように印刷します。

awk '
    {
        delete seen
        nf = 0

        for (i = 1; i <= NF; ++i)
            if (!seen[$i]++)
                field[++nf] = $i

        $0 = ""

        for (i = 1; i <= nf; ++i)
            $i = field[i]
    }; 1' file

繰り返しますが、ループを削除するには(を呼び出して暗黙的に作成しますsplit()):

awk '
    {
        delete seen
        nf = split($0, fields)

        $0 = ""

        for (i = 1; i <= nf; ++i)
            if (!seen[fields[i]]++)
                $(NF+1) = fields[i]
    }; 1' file

関連情報