Найдите повторяющиеся строки на основе столбца и напечатайте обе строки и их номера с помощью awk - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий файл:

userID PWD_HASH
test 1234
admin 1234
user 6789
abcd 5555
efgh 6666
root 1234

Использование AWK, Мне нужно найти как оригинальные строки, так и их дубликаты с номерами строк, так что получи вывод как:

NR $0
1 test 1234
2 admin 1234
6 root 1234

Я пробовал следующее, но он не печатает правильный номер строки с NR:

awk 'n=x[$2]{print NR" "n;print NR" "$0;} {x[$2]=$0;}' file.txt

Любая помощь будет оценена!

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018

Без использования awk, но с инструментами GNU coretutils:

tail -n+2 file | nl | sort -k3n | uniq -D -f2

tail удалить первую строку.
nl добавить номер строки.
sort на основе 3-го поля.
uniq печатает только дубликаты на основе 3-го поля.

0 голосов
/ 08 ноября 2018

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  a[$2]++
  b[$2,FNR]=FNR==1?FNR:(FNR-1) OFS $0
  next
}
a[$2]>1{
  print b[$2,FNR]
}
'  Input_file  Input_file

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

1 test 1234
2 admin 1234
6 root 1234

Объяснение: Ниже приведено объяснение вышеприведенного кода.

awk '                                        ##Starting awk program here.
FNR==NR{                                     ##Checking condition here FNR==NR which will be TRUE when first time Input_file is being read.
  a[$2]++                                    ##Creating an array named a whose index is $1 and incrementing its value to 1 each time it sees same index.
  b[$2,FNR]=FNR==1?FNR:(FNR-1) OFS $0        ##Creating array b whose index is $2,FNR and concatenating its value to its own.
  next                                       ##Using next for skipping all further statements from here.
}
a[$2]>1{                                     ##Checking condition where value of a[$2] is greater than 1, this will be executed when 2nd time Input_file read.
  print b[$2,FNR]                            ##Printing value of array b whose index is $2,FNR here.
}
'  Input_file  Input_file                    ##Mentioning Input_file(s) names here 2 times.
0 голосов
/ 08 ноября 2018
$ awk '
($2 in a) {          # look for duplicates in $2
    if(a[$2]) {      # if found
        print a[$2]  # output the first, stored one
        a[$2]=""     # mark it outputed
    }
    print NR,$0      # print the duplicated one
    next             # skip the storing part that follows
}
{
    a[$2]=NR OFS $0  # store the first of each with NR and full record
}' file

Вывод (с заголовком в file):

2 test 1234
3 admin 1234
7 root 1234
0 голосов
/ 08 ноября 2018

Используя GAWK, вы можете сделать это с помощью следующей конструкции: -

awk '
{
    NR>1
    {
       a[$2][NR-1 " " $0];
    }
}
END {
    for (i in a)
       if(length(a[i]) > 1)
          for (j in a[i])
             print j;
}
' Input_File.txt   

Создать 2-мерный массив.

В первом измерении сохраните PWD_HASH, а во втором измерении сохраните номер строки (NR-1), объединенный со всей строкой ($0).

Чтобы отобразить только дубликаты, вы можете использовать условие length(a[i] > 1).

...