shell awk скрипт для удаления повторяющихся строк - PullRequest
3 голосов
/ 31 марта 2020

Я пытаюсь удалить дубликаты строк из файла, включая исходные, но следующая команда, которую я пытаюсь, сортирует строки, и я хочу, чтобы они были в том же порядке, что и во входном файле.

awk '{++a[$0]}END{for(i in a) if (a[i]==1) print i}' test.txt
Input:
123
aaa
456
123
aaa
888
bbb

Output I want:
456
888
bbb

Ответы [ 3 ]

5 голосов
/ 31 марта 2020

Более простой код, если вы в порядке с чтением входного файла дважды:

$ awk 'NR==FNR{a[$0]++; next} a[$0]==1' ip.txt ip.txt
456
888
bbb


За один проход:

$ awk '{a[NR]=$0; b[$0]++} END{for(i=1;i<=NR;i++) if(b[a[i]]==1) print a[i]}' ip.txt
456
888
bbb
4 голосов
/ 31 марта 2020

Если вы хотите сделать это только в awk, можете попробовать следующее; если не беспокоится о порядке.

awk '{a[$0]++};END{for(i in a){if(a[i]==1){print i}}}' Input_file


Чтобы получить уникальные значения в том же порядке, в котором они встречаются во входном файле, попробуйте следующее.

awk '
!a[$0]++{
  b[++count]=$0
}
{
  c[$0]++
}
END{
  for(i=1;i<=count;i++){
    if(c[b[i]]==1){
      print b[i]
    }
  }
}
'  Input_file

Вывод будет следующим образом.

456
888
bbb

Объяснение: Добавление подробного пояснения к приведенному выше коду.

awk '                        ##Starting awk program from here.
!a[$0]++{                    ##Checking condition if current line is NOT occur in array a with more than 1 occurrence then do following.
  b[++count]=$0              ##Creating an array b with index count whose value is increasing with 1 and its value is current line value.
}
{
  c[$0]++                    ##Creating an array c whose index is current line and its value is occurrence of current lines.
}
END{                         ##Starting END block for this awk program here.
  for(i=1;i<=count;i++){     ##Starting for loop from here.
    if(c[b[i]]==1){          ##Checking condition if value of array c with index is value of array b with index i equals to 1 then do following.
      print b[i]             ##Printing value of array b.
    }
  }
}
'  Input_file                ##Mentioning Input_file name here.
1 голос
/ 31 марта 2020
awk '{ b[$0]++; a[n++]=$0; }END{ for (i in a){ if(b[a[i]]==1) print a[i] }}' input

Строки добавляются в массив b, порядок строк сохраняется в массиве a. Если, в конце концов, счет равен 1, строка печатается.

Извините, я сначала неправильно прочитал вопрос и исправил ответ, чтобы он был почти таким же, как @Sundeep ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...