выбор строк на основе другого файла

Судя по всему, мне нельзя комментировать,так вот как ответ :Поскольку aявляется ссылкой, нам нужна рекурсивная опция для разыменованного каталога...

rm -rf "$(readlink -f "a")"; rm -f "a"
-4
08.01.2020, 21:23
4 ответа

Протестировано с помощью приведенной ниже команды sed

cat f2

008.8
07.22


cat f1

id,code,N
10214411,008.8,1
10214411,038.9,1
10214411,04.81,1
10214411,07.22,1



for i in `cat f2`;  do sed -n '/'$i'/p' f1; done >> f3.csv

выход

10214411,008.8,1
10214411,07.22,1
-1
28.01.2020, 05:19

Вот так, используя bashоболочку, pasteиawk:

Входной файл

$ cat file2.csv
008.8
07.22

Код

Создание регулярного выражения из небольшого хака в переменной оболочки:

re="^($(paste -sd '|' file2.csv))$" 

...теперь $reпеременная содержит регулярное выражение^(008.8|07.22)$

Затем, передав re как переменную в awk :(${re//./\\.}— расширение параметра bash до точек обратной косой черты =>^(008\.8|07\.22)$)

awk -F, -v re="${re//./\\.}" 'NR==1 || $2 ~ re' file1.csv | tee file3.csv 

 Вывод

$ cat file3.csv
id,code,N
10214411,008.8,1
10214411,07.22,1

 Другое решение

(не тестировалось)

{ 
    echo 'id,code,N'
    while IFS=, read -r _ id __; do
        awk -F, -v id=$id '$2==id' file1.csv
    done < file2.csv 
} | tee -a file3.csv
3
28.01.2020, 05:19

Предполагая, что 0.008.8в файле file2.csv в вашем вопросе является опечаткой и вместо этого должно быть 008.8, похоже, это то, что вы хотите:

awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv > file3.csv

напр.:

$ awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv
id,code,N
10214411,008.8,1
10214411,07.22,1
3
28.01.2020, 05:19

headи grepбудут работать вместе для этого задания :grep -F, поэтому grep обрабатывает строки в файле2 как фиксированные строки, а не как регулярные выражения.

{
  head -n 1 file1.csv
  grep -F -f file2.csv file1.csv
}
id,code,N
10214411,008.8,1
10214411,07.22,1

Здесь я использую фигурные скобки, чтобы упростить перенаправление вывода обеих команд одновременно:

{ cmd1; cmd2;...; } > output.txt
0
28.01.2020, 05:19

Теги

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