Bash 在unix中使用cut和grep命令
我有一个文件(file1.txt),文本如下: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中时,此
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]
,表示我们已看到此行的值。然后,我们指示awk跳过其余命令,并在下一行重新开始 此部分仅针对file2运行,因为file2在命令行中列在第一位,并且只有在读取命令行中列出的第一个文件时,1
。这是因为FNR==NR
是从当前文件读取的行数,FNR
是到目前为止读取的总行数。这两个值仅在第一个文件中相等NR
读取file1.txt时,如果在file2中看到第2列,!a[$2]
的计算结果为true。自从<代码>是否定的,a[$2]
的计算结果为true。当计算结果为true时,将打印该行!当未看到第2列时,[$2]
$ 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]
,表示我们已看到此行的值。然后,我们指示awk跳过其余命令,并在下一行重新开始 此部分仅针对file2运行,因为file2在命令行中列在第一位,并且只有在读取命令行中列出的第一个文件时,1
。这是因为FNR==NR
是从当前文件读取的行数,FNR
是到目前为止读取的总行数。这两个值仅在第一个文件中相等NR
读取file1.txt时,如果在file2中看到第2列,!a[$2]
的计算结果为true。自从<代码>是否定的,a[$2]
的计算结果为true。当计算结果为true时,将打印该行!当未看到第2列时,[$2]
$ 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非常好;我为你的答案添加了代码。