【问题标题】:Using cut and grep commands in unix在 unix 中使用 cut 和 grep 命令
【发布时间】:2015-06-08 07:02:31
【问题描述】:

我有一个文件 (file1.txt),其文本为:

aaa,,,,,
aaa,10001781,,,,
aaa,10001782,,,,
bbb,10001783,,,,

我的 file2 内容是:

11111111
10001781
11111222

如果模式匹配,我需要在 file2 中搜索 file1 的第二个字段并从 file1 中删除该行。所以输出将是:

aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,

我可以为此使用 grep 和 cut 命令吗?

【问题讨论】:

    标签: bash unix grep cut


    【解决方案1】:

    仅当 第二个字段 不在 file2 中时,才会从 file1.txt 打印行:

    $ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
    aaa,,,,,
    aaa,10001782,,,,
    bbb,10001783,,,,
    

    工作原理

    这通过读取 file2 并跟踪在关联数组 a 中看到的所有行来工作。然后,仅当 file1.txt 的第 2 列不在 a 中时,才会打印 file1.txt 中的行。更详细:

    • FNR==NR{a[$1]=1; next;}

      在读取file2 时,将a[$1] 设置为1 以表明我们已经看到了这一行的值。然后我们指示 awk 跳过其余命令并从 next 行重新开始。

      此部分仅针对 file2 运行,因为 file2 在命令行中首先列出,FNR==NR 仅在我们读取命令行中列出的第一个文件时。这是因为FNR 是从当前文件读取的行数,NR 是目前读取的总行数。这两个仅对第一个文件相等。

    • !a[$2]

      读取 file1.txt 时,如果在 file2 中看到第 2 列,a[$2] 的计算结果为 true。因为! 是否定的,所以!a[$2] 在没有看到第2 列时评估为真。当计算结果为 true 时,将打印该行。

    另类

    这是相同的逻辑,表达方式略有不同,正如 Tom Fenech 在 cmets 中所建议的那样:

    $ awk -F, 'FNR==NR{a[$1]; next;} !($2 in a)' file2 file1.txt
    aaa,,,,,
    aaa,10001782,,,,
    bbb,10001783,,,,
    

    【讨论】:

    • 感谢您的回复。因为 jurgemaister 指出,我的 solaris 中的所有命令版本都指向旧文件夹 '/usr/bin/'。因此我收到错误为“awk:第 1 行附近的语法错误, awk:在 1 号线附近救援”
    • 尝试运行which -a awk gawk。看看你是否安装了更新的 awk。
    • @user1768029 好的。代替默认的 awk,尝试运行 nawk/usr/xpg4/bin/awk/usr/xpg6/bin/awk
    • 我可能会简单地设置数组中的键 a[$1]; 然后使用 $2 in a 但任何一种方式都有效。无论如何,很好的解释。
    • @TomFenech 很好;我用你的方法添加了代码。
    【解决方案2】:

    用 grep 解决

    $ grep -vf file2 file1.txt
    aaa,,,,,
    aaa,10001782,,,,
    bbb,10001783,,,,
    

    不过,对于大文件,John1024 的 awk 解决方案会更快。

    【讨论】:

    • 我收到错误 - “grep: 非法选项 -- f”。我正在使用 bash shell。我们可以在 bash 中使用此命令吗?
    • 您使用哪个操作系统和哪个版本的 grep?
    • SunOS boc02 5.10 Generic_144488-12 sun4u sparc SUNW,Sun-Fire-V240
    • 或者只是更新您的PATH 以在/usr/bin 之前添加/usr/xpg4/bin。通常这是在您的.profile 或类似名称中设置的。
    • 这假定该字段不能作为不需要的字段的子字符串出现,并且它不会出现在您打算搜索的列之外的另一列中。由于这些原因,Awk 解决方案要优越得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多