我有两组文本文件。第一组位于 AA 文件夹中。第二组位于 BB 文件夹中。第一组(AA文件夹)中的ff.txt文件的内容如下所示。
Name number marks
john 1 60
maria 2 54
samuel 3 62
ben 4 63
如果标记>60,我想打印该文件的第二列(数字)。输出将为 3,4。接下来,读取BB文件夹中的ff.txt文件,删除包含数字3,4的行。
BB文件夹中的文件如下所示。第二列是数字。
marks 1 11.824 24.015 41.220 1.00 13.65
marks 1 13.058 24.521 40.718 1.00 11.82
marks 3 12.120 13.472 46.317 1.00 10.62
marks 4 10.343 24.731 47.771 1.00 8.18
我使用了以下代码。此代码对于一个文件来说可以完美运行。
gawk 'BEGIN {getline} $3>60{print $2}' AA/ff.txt | while read number; do gawk -v number=$number '$2 != number' BB/ff.txt > /tmp/ff.txt; mv /tmp/ff.txt BB/ff.txt; done
但是当我使用多个文件运行此代码时,出现错误。
gawk 'BEGIN {getline} $3>60{print $2}' AA/*.txt | while read number; do gawk -v number=$number '$2 != number' BB/*.txt > /tmp/*.txt; mv /tmp/*.txt BB/*.txt; done
error:-
mv: target `BB/kk.txt' is not a directory
我两天前问过这个问题。请帮我解决这个错误。
最佳答案
这将创建文件夹 AA
中所有文件的索引,并检查文件夹 BB
中的所有文件:
cat AA/*.txt | awk 'FNR==NR { if ($3 > 60) 数组[$2]; next } !($2 in array)' - BB/*.txt
这会比较两个单独的文件,假设它们在文件夹 AA
和 BB
中具有相同的名称:
ls AA/*.txt | sed "s%AA/\(.*\)%awk 'FNR==NR { if (\$3 > 60) array[\$2]; next } !(\$2 in array)' & BB/\1 %"|嘘
HTH
编辑
这应该有帮助:-)
ls AA/*.txt | sed "s%AA/\(.*\)%awk 'FNR==NR { if (\$3 > 60) array[\$2]; next } !(\$2 in array)' & BB/\1 >\1_tmp\&\& mv\1_tmp BB/\1 %"|嘘
关于sed - 使用 gawk/awk/sed 从多个文件中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10571069/