Результаты поиска AWK в другом файле

Еще один:

xargs -0 python < <(find -name my_script.py -print0 -quit)

Теперь, как домашнее задание, попробуйте определить плюсы, минусы и различия всех методов, представленных здесь.

1
задан 19 December 2016 в 17:40

4 ответа

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

join -o 2.1,2.2 file1 file2

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

4
ответ дан 23 May 2018 в 03:13

Вы можете использовать следующий однострочный:

cut -f1 fileA | grep -f - fileB > fileC
команда cut будет извлекать первый столбец из fileA (при условии разделения вкладок. используйте -d, чтобы указать что-то еще) команда grep выводит вывод cut и выполняет поиск fileB для всех строк. выход будет записан в fileC
3
ответ дан 23 May 2018 в 03:13
  • 1
    Обратите внимание, что это предполагает, что поля разделены на вкладку. – terdon♦ 19 December 2016 в 19:10
  • 2
    Да, я знаю. Я упомянул об этом в первом пункте :-) – Wayne_Yux 19 December 2016 в 19:15
  • 3
    Argh. Так ты и сделал. Сожалею! – terdon♦ 19 December 2016 в 19:22

Вы уже получили отличные ответы. Просто добавьте в микс, вот подход 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 May 2018 в 03:13

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

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.
1
ответ дан 23 May 2018 в 03:13
  • 1
    Это также будет соответствовать подстрокам. Например, если fileA содержит fooseg1, а file2 содержит seg1, он будет считаться совпадением. – terdon♦ 19 December 2016 в 19:13
  • 2
    @terdon Спасибо за комментарий. – ankit7540 19 December 2016 в 19:38
  • 3
    Вы можете исправить это с помощью опции grep -w. Вы также можете сделать все это за один шаг, нет необходимости в массиве: awk 'NR>1 {print $1}' "$fa" | while read index; do .... О, и вы всегда должны указывать свои переменные . Тем не менее, использование оболочки для такого рода вещей действительно не очень хорошая идея . Трудно писать, легко ошибаться и всегда будет очень медленным. – terdon♦ 19 December 2016 в 19:46
  • 4
    Я относительно новичок в сценариях оболочки, и, как упоминалось в ссылках, я буду изучать и улучшать свой стиль. Спасибо за ссылки. Действительно полезно! – ankit7540 19 December 2016 в 20:41
  • 5
    Всегда пожалуйста. Мы все здесь, чтобы учиться! – terdon♦ 19 December 2016 в 20:51

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

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