Сравните столбцы в двух файлах и напечатайте значения совпадений в определенных столбцах - PullRequest
0 голосов
/ 17 февраля 2019

В следующем случае.Я хотел бы найти значения, которые совпадают в: файл1: столбцы 8 и 9 с файлом2: столбцы 2 и 3

Если значения одинаковы в обоих файлах, распечатайте как нужный выходной файл

file1

31429,36689,313212.5,2334362.5,31429,36679,31308,302412.50 2316512.50
31429,36701,313362.5,2334362.5,31429,36681,31311,2334363,31429
31429,36713,313512.5,2334362.5,31429,36719,31358,303312.50 2316512.50
31429,36749,313962.5,2334362.5,31429,36751,31398,2334362,31429
31429,36809,314712.5,2334362.5,31429,36803,31463,2334361,31429
31429,36821,314862.5,2334362.5,31429,36817,31481,2334363,31429

file2

3000135825 302412.50 2316512.50
3000135837 302562.50 2316512.50
3000135849 302712.50 2316512.50
3000135861 302862.50 2316512.50
3000135873 303012.50 2316512.50
3000135885 303162.50 2316512.50
3000135897 303312.50 2316512.50
3000135909 303462.50 2316512.50
3000135921 303612.50 2316512.50
3000135933 303762.50 2316512.50
3000135945 303912.50 2316512.50

желаемый вывод

3000135825 302412.50 2316512.50 3667931308 302412.50 2316512.50
3000135897 303312.50 2316512.50 3671931358 303312.50 2316512.50

Я пытался Используя эту команду, я получил результаты, НО это занимает много времени, так как файл2 имеет 3 миллиона строк, а код занимает слишком много времени. Чтобы иметь возможность использовать код, сначала я создаювременный файл с именем tmp1 со столбцами 5,6,8,9 из file1

awk -F, '{print($5$6,$8,$9)}' file1 > tmp1 

awk 'FNR==NR{a[$2$3]=$0;next}{print $0,a[$2$3]?a[$2$3]:"NA"}' file2 tmp1

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

Поскольку вы беспокоитесь о производительности, не могли бы вы попробовать это решение Perl.

$ perl -lne 'BEGIN{@x=map{chomp;@k=split(/[ ,]/,$_);$kv{"$k[-2] $k[-1]"}="$k[-4]$k[-3]"} qx(cat file1.txt)} /(\S+) (\S+)$/ and $kv{$&} and print $_," ",$kv{$&}, " ",$& ' f
ile2.txt
3000135825 302412.50 2316512.50 3667931308 302412.50 2316512.50
3000135897 303312.50 2316512.50 3671931358 303312.50 2316512.50

$
0 голосов
/ 18 февраля 2019

Для скорости я бы подумал:

1 - максимально использовать команды строки оболочки

2 - поместить в файл только необходимые столбцы

3 - сортировка

4 - хранить файлы и выводить их в переменных - команды print и file занимают слишком много времени в больших циклах

0 голосов
/ 18 февраля 2019

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

awk 'FNR==NR{a[$8 OFS $9]=$6 $7 OFS $8 OFS $9;next} (($2 OFS $3) in a){print $0,a[$2 OFS $3]}' FS="[, ]"  Input_file1 FS=" " Input_file2

Добавление формы решения, не относящейся к одному вкладышу, сейчас.

awk '
FNR==NR{
  a[$8 OFS $9]=$6 $7 OFS $8 OFS $9
  next
}
(($2 OFS $3) in a){
  print $0,a[$2 OFS $3]
}
' FS="[, ]"  Input_file1 FS=" "  Input_file2

Объяснение: Добавление пояснения к вышеуказанному коду тоже сейчас.

awk '
FNR==NR{                              ##Checking condition FNR==NR this will be TRUE when firt Input_file named Input_file1 is being executed.
  a[$8 OFS $9]=$6 $7 OFS $8 OFS $9    ##Creating an array named a whose index is $8 OFS $9 and value if $6 $7 OFS $8 OFS $9.
  next                                ##next keyword is out of the box of awk and will skip further statements from here.
}
(($2 OFS $3) in a){                   ##Statements from here will be executed when 2nd Input_file is being read named Input_file2. Checkingh condition if $2 OFS $3 is present in array a then do following.
  print $0,a[$2 OFS $3]               ##Printing current line along with value of array a whose index is $2 OFS $3.
}                                     ##Closing block for above condition now.
' FS="[, ]" Input_file1 FS=" " Input_file2        ##Setting FS for Input_file1 as comma OR space here then mentioning Input_file1 name then setting FS as space and mentioning Input_file2 name here.
0 голосов
/ 17 февраля 2019

Если длина файла1 намного меньше, чем файл2, вы можете вместо этого кэшировать содержимое файла 1.

что-то вроде этого (не проверено)

$ awk -F, 'NR==FNR      {a[$8,$9]==$6$7; next}   # is $6$7 the key you want to print?
           ($2,$3) in a {print $1,$2,$3,a[$2,$3]}' file1 FS=' ' file2

, так как значения должны совпадать, нет необходимостинапечатайте их снова.Не уверен, какое четвертое значение напечатано в выводе, но если оно исходит из file1, просто замените его.

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