Поисковый вывод AWK в другом файле

У меня есть два файла fileA и fileB.

Я должен извлечь column1 из fileA как awk '{print $1}' и затем вывод будет искаться в другой fileB и сохранит подобранные записи в новый файл файлы в простых словах как:

fileA:

seg1     rec1
seg2     rec2
seg3     rec3 

Я должен получить столбец 1 при помощи команды awk, и этот столбец 1 ищется в fileB получать записи как:

fileB:

seg1     one
seg2     two
seg3     three
seg4     four
seg5     five

От fileA, column1 данные извлечен и и эти данные используются для поиска в fileB, и подобранная запись сохраняется в тестовый файл. Мой вывод должен быть похожим на это:

fileC:

seg1       one
seg2       two
seg3       three
4
задан 19 December 2016 в 06:40

5 ответов

Может быть достигнут легко с awk следующим образом:

awk 'NR==FNR{inFileA[$1]; next} ($1 in inFileA)' fileA fileB > write_to_fileC

результат,

seg1       one
seg2       two
seg3       three

в вышеупомянутом, сначала мы читаем fileA, и содержит весь column1 от в массив, названный inFileA, затем посмотрите в fileB для его первого столбца и если он соответствует сохраненному column1 от fileA, затем идет для печати всей строки fileB.

8
ответ дан 23 November 2019 в 11:35

Если столбцы, которые будут сравнены, отсортированы, можно использовать join:

join -o 2.1,2.2 file1 file2

join соответствия отсортировали столбцы из входных файлов и печатают их. -o 2,1,2.2 ограничивает вывод первыми и вторыми столбцами второго входного файла.

4
ответ дан 23 November 2019 в 11:35

Можно использовать следующую остроту:

cut -f1 fileA | grep -f - fileB > fileC
  • эти cut команда извлечет первый столбец fileA (принятие разделения вкладки. используйте -d для определения чего-то еще)
  • эти grep, команда берет вывод cut и поиски fileB для всех строк.
  • вывод будет записан в fileC
3
ответ дан 23 November 2019 в 11:35

Попытка со сценарием удара. (Не забудьте делать исполняемый файл.)

fileA и fileB должен существовать в той же папке как сценарий.

А общий сценарий, который будет работать на любые два файла, описанные со сценарием, и генерировать файл с совпавшим текстом как <fa>_<fb>_match.txt:

Для использования этого работайте ./script_name.sh fileA fileB

#!/bin/bash
fa="$1"  # first file- which has  columns
fb="$2"  # second file - which has  raw data to be searched
# file with name <fa>_<fb>_match.txt will be generated.

myarr=($(awk 'NR>1 {print $1}' "$fa")) # NR makes awk to ignore first row.

for index in ${!myarr[@]}; do
    #echo $index/${#myarr[@]}
    #echo    "${myarr[index]}"
text="${myarr[index]}"
grep -w -F "$text" $fb  >>  $fa"_"$fb"_match".txt
done

# file with name <fa>_<fb>_match.txt will be generated.
2
ответ дан 23 November 2019 в 11:35

Вы уже получили некоторые превосходные ответы. Только для добавления к соединению вот подход Perl:

$ perl -ane '$i ? $k{$F[0]} && print : { $k{$F[0]}++ }; $i++ if eof' fileA fileB
seg1     one
seg2     two
seg3     three

И игравшая в гольф версия ответ KasiyA :

$ awk 'NR==FNR ? a[$1] : $1 in a' fileA fileB 
seg1     one
seg2     two
seg3     three

И вот своего рода замысловатое grep решение:

$ grep -Ff <(grep -oP '^\S+' fileA) fileB
seg1     one
seg2     two
seg3     three
2
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: