sed - 使用 gawk/awk/sed 从多个文件中删除行

标签 sed awk gawk

我有两组文本文件。第一组位于 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

这会比较两个单独的文件,假设它们在文件夹 AABB 中具有相同的名称:

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/

相关文章:

linux - 每分钟运行一次 sed 命令

string - 在bash中提取两个字符之间的字符串

linux - 在 AWK 中使用 if/else 语句

linux - 如何使用 AWK 语句替换每次出现的事件

linux - 将 gensub 应用于 awk 中所有字段的快捷方式

sed - 如何使用 'sed or gawk' 删除文本 block 直到最后一行之前的第三行

xml - 如何提取两个字符串之间的子字符串,包括匹配/封闭的字符串?

linux - 用空格和特殊字符替换文本

bash - 重命名具有各种扩展名的文件

awk - 使用 awk 删除没有后续内容行的标题行