Как удалить повторяющиеся значения в одной строке с помощью awk?

Хотя некоторые реализации awk позволяют читать из подчиненных -конвейерных процессов 1 , в этом случае я бы предложил прочитать всю строку из второго файла и выполнить разбиение полей внутри awk:

$ awk '(getline line < "file2.txt") > 0 {split(line,a); $1 = $1 FS a[2]} 1' file1.txt
1 b 2 3 4
5 d 5 6
7 f 7 7 7 9 10

В качестве альтернативы вы можете использовать pasteи cut, полностью избегая awk


  1. см., например, Использование getline из конвейера

0
30.08.2021, 09:44
3 ответа
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
1
30.08.2021, 12:49
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
1
30.08.2021, 19:53

В основном, как и другие ответы, но с перестроением «текущей записи», печатая ее с помощью этого 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
1
31.08.2021, 21:10

Теги

Похожие вопросы