Судя по всему, мне нельзя комментировать,так вот как ответ :Поскольку a
является ссылкой, нам нужна рекурсивная опция для разыменованного каталога...
rm -rf "$(readlink -f "a")"; rm -f "a"
Протестировано с помощью приведенной ниже команды 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
Вот так, используя 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
Предполагая, что 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
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