linux - 从 shell 中清理文件

标签 linux bash shell awk

我的 shell 技能有点生疏,但我想做的是获取 2 个文件,并根据匹配字段从另一个文件中“删除”一个文件。这是重要的部分,该行的其余部分可以不同,但​​如果关键字段匹配,它将被删除。例如,我的文件是管道分隔的,第二个字段是关键字段。

File 1
------
acme|widg001|green|plant a|<timestamp>
acme|widg102|blue|plant b|<timestamp>
acme|widg002|yellow|plant a|<timestamp

File 2
------
acme|widg001|blue|plant a|<timestamp>
acme|widg701|blue|plant a|<timestamp>

当我从文件 1 中删除文件 2 时,我希望生成的文件包含的是

New File
------
acme|widg102|blue|plant b|<timestamp>
acme|widg002|yellow|plant a|<timestamp>

理想情况下,该解决方案允许我指定 2 个以上的文件,即从文件 1 中删除文件 2、3 和 4。

任何帮助都会很棒!

最佳答案

既然您要求使用 Bash,我决定只使用 Bash 试试看。完全没有外部程序。

IFS='|'
declare -A scrub

while read f1 f2 rest; do
    scrub[$f2]=0
done < file2.txt

while read f1 f2 rest; do
    if [ ! ${scrub[$f2]} ]; then
        echo "$f1|$f2|$rest"
    fi
done < file1.txt

这会首先缓存要删除的值,然后遍历第一个文件中的候选值,打印那些未删除的值。它不漂亮,但它是 Bash。

关于linux - 从 shell 中清理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18104971/

相关文章:

android - Docker:无法在 ubuntu 16.10 容器中执行挂载命令

linux - 使用 grep 和 sed 查找和替换字符串

linux - BASH 使用变量检查事件连接

python - 如何使用 "at"unix 命令直接从终端调度 python 脚本?

c - 通过创建内核例程打印/proc/slabinfo

linux - 如何在 Bash 中对字母数字字符串进行排序

Linux,查找 > zcat > wc

perl - 我如何在 Perl 的 system() 中使用 bash 语法?

linux - 如何判断一个文件的内容是否包含在另一个文件的内容中

regex - 在日志中的日期范围之间进行 grep