1

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

File A
4
5
8
9

File B
1 text
2 text1
3 text2
4 text3
5 text4
6 text5
7 text6
8 text7
9 text8

То, что я хочу получить для вывода, - это следующее (второе поле в файле B, если оно соответствует номеру строки в файле A)

test3
test4
text7
text8

3 ответа3

1

Вы можете создать простой скрипт sed из файла A, добавив p к каждой строке, а затем запустить скрипт в другом sed с -n чтобы не печатать другие строки. Более того, нет необходимости сохранять сгенерированный скрипт, вы можете передать его между sed :

sed 's/$/p/' A | sed -nf- B
1
$ awk 'FNR==NR{seen[$1];next;} FNR in seen' FileA FileB
text3
text4
text7
text8

Как это устроено

  • FNR==NR{seen[$1];next;}

    Во время чтения первого файла, это добавляет каждый номер как keey в ассоциативном массиве seen

    FNR - номер строки текущего файла, а NR - номер строки среди всех прочитанных строк. Поэтому, когда FNR==NR , мы все еще читаем первый файл, в данном случае FileA . seen[$1] создает ключ в seen со значением $1 . next сообщает awk, чтобы пропустить остальные команды и начать все заново со следующей строки.

  • FNR in seen

    При чтении второго файла, это печатает любую строку, если ее номер строки seen .

    FNR in seen состоянии. Он истинен , если номер строки FNR является ключевым в массиве seen Поскольку мы не указали никаких действий для этого условия, выполняется действие по умолчанию, которое заключается в печати строки.

1

Вы выполняете реляционную операцию соединения, поэтому используйте стандартную команду join UNIX:

$ join fileA.txt fileB.txt
4 text3
5 text4
8 text7
9 text8

Чтобы получить только второе поле из второго файла, добавьте -o 2.2:

$ join -o 2.2 fileA.txt fileB.txt
text3
text4
text7
text8

Оба файла должны быть отсортированы в поле соединения (первый столбец в этом примере), чтобы это работало.

Ура!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .