Как прочитать список, если строки из одного файла и искать в другом файле? - PullRequest
0 голосов
/ 23 сентября 2019

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

Я попытался grep -f file1.txt file2.txt, но он сравнивает строки во всей строкеи распечатать его, и я хочу сравнить только с первым столбцом и напечатать строку

Например.

file1.txt

34534
67823
41400

file2.txt 

41400 41440 52705 10254 20239 39975 40075 71022 82531
43897 41420 71104 10252 20243 41400 71065 83830
34534 41440 83203 10266 20255 40086 70262 84476
78314 22540 60000 10250 20247 40083 82432
67823 41440 70000 10246 20231 39646 40092 71052 83531

вывод:

41400 41440 52705 10254 20239 39975 40075 71022 82531
43897 41420 71104 10252 20243 <b>41400</b> 71065 83830
34534 41440 83203 10266 20255 40086 70262 84476
67823 41440 70000 10246 20231 39646 40092 71052 83531

Ниже ожидаемый результат:

34534 41440 83203 10266 20255 40086 70262 84476
67823 41440 70000 10246 20231 39646 40092 71052 83531
41400 41440 52705 10254 20239 39975 40075 71022 82531

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Я бы использовал awk:

$ awk 'NR==FNR{a[$0];next}($1 in a)' file1 file2

Вывод:

41400 41440 52705 10254 20239 39975 40075 71022 82531
34534 41440 83203 10266 20255 40086 70262 84476
67823 41440 70000 10246 20231 39646 40092 71052 83531

Объяснил:

$ awk '        # using awk
NR==FNR {      # process the first file
    a[$0]      # hash words to a array
    next       # move to proces next word if any left
}
($1 in a)      # if the first word of the second file record was hashed, output
' file1 file2

Обновление :

Для печати в порядке file1.txt используйте:

$ awk '
NR==FNR {
    a[$1]=a[$1] (a[$1]==""?"":RS) $0   # catenate records based on $1
    next
}
{
    print a[$0]
}' file2.txt <(tac file1.txt)

При изменении порядка записей выше демонстрируется обратное изменение file1.txt с использованием rev.Вывод в другом порядке:

67823 41440 70000 10246 20231 39646 40092 71052 83531
34534 41440 83203 10266 20255 40086 70262 84476
41400 41440 52705 10254 20239 39975 40075 71022 82531
0 голосов
/ 23 сентября 2019
grep -f <(sed 's/^/^/' file1.txt) file2.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...