У меня есть два файла 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
Может быть достигнут легко с 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.
Если столбцы, которые будут сравнены, отсортированы, можно использовать join
:
join -o 2.1,2.2 file1 file2
join
соответствия отсортировали столбцы из входных файлов и печатают их. -o 2,1,2.2
ограничивает вывод первыми и вторыми столбцами второго входного файла.
Можно использовать следующую остроту:
cut -f1 fileA | grep -f - fileB > fileC
cut
команда извлечет первый столбец fileA
(принятие разделения вкладки. используйте -d
для определения чего-то еще) grep
, команда берет вывод cut
и поиски fileB
для всех строк. fileC
Попытка со сценарием удара. (Не забудьте делать исполняемый файл.)
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.
Вы уже получили некоторые превосходные ответы. Только для добавления к соединению вот подход 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