Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在unix中使用cut和grep命令_Bash_Unix_Grep_Cut - Fatal编程技术网

Bash 在unix中使用cut和grep命令

Bash 在unix中使用cut和grep命令,bash,unix,grep,cut,Bash,Unix,Grep,Cut,我有一个文件(file1.txt),文本如下: aaa,,,,, aaa,10001781,,,, aaa,10001782,,,, bbb,10001783,,,, 我的文件2的内容是: 11111111 10001781 11111222 我需要在文件2中搜索文件1的第二个字段,如果模式匹配,则从文件1中删除该行。因此,输出将为: aaa,,,,, aaa,10001782,,,, bbb,10001783,,,, 我可以为此使用grep和cut命令吗?仅当第二个字段不在文件2中时,此

我有一个文件(file1.txt),文本如下:

aaa,,,,,
aaa,10001781,,,,
aaa,10001782,,,,
bbb,10001783,,,,
我的文件2的内容是:

11111111
10001781
11111222
我需要在文件2中搜索文件1的第二个字段,如果模式匹配,则从文件1中删除该行。因此,输出将为:

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

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

仅当第二个字段不在文件2中时,此命令才打印file1.txt中的行:

$ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
工作原理 这是通过读取文件2并跟踪关联数组
a
中看到的所有行来实现的。然后,仅当file1.txt的第2列不在
a
中时,才会打印file1.txt中的行。更详细地说:

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

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

    此部分仅针对file2运行,因为file2在命令行中列在第一位,并且只有在读取命令行中列出的第一个文件时,
    FNR==NR
    。这是因为
    FNR
    是从当前文件读取的行数,
    NR
    是到目前为止读取的总行数。这两个值仅在第一个文件中相等

  • !a[$2]

    读取file1.txt时,如果在file2中看到第2列,
    a[$2]
    的计算结果为true。自从<代码>是否定的,
    !当未看到第2列时,[$2]
    的计算结果为true。当计算结果为true时,将打印该行

可供替代的 正如Tom Fenech在评论中所建议的那样,这是相同的逻辑,以稍微不同的风格表达:

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

仅当第二个字段不在文件2中时,才会打印file1.txt中的行:

$ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
工作原理 这是通过读取文件2并跟踪关联数组
a
中看到的所有行来实现的。然后,仅当file1.txt的第2列不在
a
中时,才会打印file1.txt中的行。更详细地说:

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

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

    此部分仅针对file2运行,因为file2在命令行中列在第一位,并且只有在读取命令行中列出的第一个文件时,
    FNR==NR
    。这是因为
    FNR
    是从当前文件读取的行数,
    NR
    是到目前为止读取的总行数。这两个值仅在第一个文件中相等

  • !a[$2]

    读取file1.txt时,如果在file2中看到第2列,
    a[$2]
    的计算结果为true。自从<代码>是否定的,
    !当未看到第2列时,[$2]
    的计算结果为true。当计算结果为true时,将打印该行

可供替代的 正如Tom Fenech在评论中所建议的那样,这是相同的逻辑,以稍微不同的风格表达:

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

$ grep -vf file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
不过,John1024的awk解析对于大文件来说会更快。

使用grep进行解析

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


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

我得到的错误是“grep:unligal option--f”。我正在使用bash shell。我们可以在bash中使用此命令吗?您使用的是哪个操作系统和哪个版本的grep?SunOS boc02 5.10 Generic_144488-12 sun4u sparc SUNW,Sun-Fire-v240,或者只需在
/usr/xpg4/bin
之前更新您的
路径
。通常这是在
.profile
或类似文件中设置的。这假设该字段不能作为不需要的字段的子字符串出现,并且不会出现在您要搜索的列之外的其他列中。由于这些原因,Awk解决方案要优越得多。我正在使用bash shell。我们可以在bash中使用此命令吗?您使用的是哪个操作系统和哪个版本的grep?SunOS boc02 5.10 Generic_144488-12 sun4u sparc SUNW,Sun-Fire-v240,或者只需在
/usr/xpg4/bin
之前更新您的
路径
。通常这是在
.profile
或类似文件中设置的。这假设该字段不能作为不需要的字段的子字符串出现,并且不会出现在您要搜索的列之外的其他列中。出于这些原因,Awk解决方案优越得多。感谢您的回复。jurgemaister指出,我的solaris中的所有命令版本都指向旧文件夹“/usr/bin/”。因此,我得到的错误是“Awk:syntax error靠近第1行,Awk:bailing out靠近第1行”,请尝试运行
,这是一个Awk gawk
。查看是否安装了更新的awk。@user1768029确定。代替默认的awk,尝试运行
nawk
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
然后在中使用
$2,但两种方法都有效。反正解释得不错。@TomFenech非常好;我用你的方法为答案添加了代码。谢谢你的回答。jurgemaister指出我的solaris中的所有命令版本都指向旧文件夹“/usr/bin/”。因此,我得到的错误是“awk:syntax error靠近第1行,awk:bailing out靠近第1行”,请尝试运行
哪个-awk gawk
。查看是否安装了更新的awk。@user1768029确定。代替默认的awk,尝试运行
nawk
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
然后在中使用
$2,但两种方法都有效。反正解释得不错。@TomFenech非常好;我为你的答案添加了代码。