Можно ли взять 2 столбца из файла 1, найти их в файле 2 и извлечь соответствующие строки из файла 2 в файл 3? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 2 текстовых файла.Файл1 содержит около 1000 строк, а Файл2 - 20000 строк.Выдержка из File1 выглядит следующим образом:

 /BBC Micro/Thrust
 /Amiga/Alien Breed Special Edition '92
 /Arcade-Vertical/amidar
 /MAME (Advance)/mario
 /Arcade-Vertical/mspacman
 /Sharp X68000/Bubble Bobble (1989)(Dempa)
 /BBC Micro/Chuckie Egg

Извлечение из File2 выглядит следующим образом:

 005;005;Arcade-Vertical;;;;;;;;;;;;;;
 Alien Breed Special Edition '92;Alien Breed Special Edition '92;Amiga;;1992;Team 17;Action / Shooter;;;;;;;;;;
 Alien 8 (Japan);Alien 8 (Japan);msx;;1987;Nippon Dexter Co., Ltd.;Action;1;;;;;;;;;
 amidar;amidar;Arcade-Vertical;;;;;;;;;;;;;;
 Bubble Bobble (Japan);Bubble Bobble (Japan);msx2;;;;;;;;;;;;;;
 Buffy the Vampire Slayer - Wrath of the Darkhul King (USA, Europe);Buffy the Vampire Slayer - Wrath of the Darkhul King (USA, Europe);Nintendo Game Boy Advance;;2003;THQ;Action;;;;;;;;;;
 mario;mario;FBA;;;;;;;;;;;;;;
 mspacman;mspacman;Arcade-Vertical;;;;;;;;;;;;;;
 Thrust;Thrust;BBC Micro;;;;;;;;;;;;;;
 Thunder Blade (1988)(U.S. Gold)[128K];Thunder Blade (1988)(U.S. Gold)[128K];ZX Spectrum;;;;;;;;;;;;;;
 Thunder Mario v0.1 (SMB1 Hack);Thunder Mario v0.1 (SMB1 Hack);Nintendo NES Hacks 2;;;;;;;;;;;;;;
 Thrust;Thrust;Vectrex;;;;;;;;;;;;;;

В File3 (выходной файл) с использованием grep, sed, awk или abash script, я бы хотел получить следующий вывод:

  Thrust;Thrust;BBC Micro;;;;;;;;;;;;;;
  Alien Breed Special Edition '92;Alien Breed Special Edition '92;Amiga;;1992;Team 17;Action / Shooter;;;;;;;;;;
  amidar;amidar;Arcade-Vertical;;;;;;;;;;;;;;
  mspacman;mspacman;Arcade-Vertical;;;;;;;;;;;;;; 

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

Использование sudo awk -F \;'NR == FNR {a [$ 1] = $ 0; далее} $ 1 в {print a [$ 1]}', я обнаружил, что Thrust; Thrust; Vectrex ;;;;;;;;;;;;;;был записан в файле 3 вместо Thrust; Thrust; BBC Micro ;;;;;;;;;;;;;;(последний - вывод, который я ищу).

Точно так же, Марио; Марио; FBA ;;;;;;;;;;;;;;не появится в File3, потому что он не совпадает / MAME (Advance) / mario, так как «MAME (Advance)» не совпадает.Это хорошо.То же самое для Bubble Bobble (Япония), Bubble Bobble (Япония); msx2 ;;;;;;;;;;;;;;;;;;;который не соответствует ни «Sharp X68000», ни «Bubble Bobble (1989) (Dempa)».

1 Ответ

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

Использование AWK и ассоциативного массива Вы можете использовать это:

awk '
BEGIN {
  if ( ARGC != 3 ) exit(1);
  FS="/";
  while ( getline < ARGV[2] ) mfggames[$2"/"$3]=1;
  FS=";";
  ARGC=2;
}
mfggames[$3"/"$1]
' file2 file1

Вывод:

Alien Breed Special Edition '92;Alien Breed Special Edition '92;Amiga;;1992;Team 17;Action / Shooter;;;;;;;;;;
amidar;amidar;Arcade-Vertical;;;;;;;;;;;;;;
mspacman;mspacman;Arcade-Vertical;;;;;;;;;;;;;;
Thrust;Thrust;BBC Micro;;;;;;;;;;;;;;

Сортировка по решению file1 (согласно запросу комментария):

awk '
BEGIN {
  if ( ARGC != 3 ) exit(1);
  FS="/";
  while ( getline < ARGV[2] ) mfggames[$2"/"$3]=++order;
  FS=";";
  ARGC=2;
}
mfggames[$3"/"$1] { print(mfggames[$3"/"$1] FS $0); }
' file2 file1 | sort -n | cut -d ';' -f 2-

Вывод:

Thrust;Thrust;BBC Micro;;;;;;;;;;;;;;
Alien Breed Special Edition '92;Alien Breed Special Edition '92;Amiga;;1992;Team 17;Action / Shooter;;;;;;;;;;
amidar;amidar;Arcade-Vertical;;;;;;;;;;;;;;
mspacman;mspacman;Arcade-Vertical;;;;;;;;;;;;;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...