[英]Show lines which does not contain specific string on Linux
我的 Linux 服务器上有一个包含以下字符的文本文件:
ID DATA
MF00034657,12435464^DRogan^DPUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;M-DT_MAX_1;
MF00056578,12435464^DRogan^DPUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;UM-DT_MAX_123;
现在我需要过滤不包含“PUM-DT_MAX_1234”的行并将它们保存在另一个带有 ID 的文件中。
像这样:
MF00034657,M-DT_MAX_1
MF00056578,UM-DT_MAX_123
我用:
grep -v 'PUM-DT_MAX_1234' file > file.out
awk '!/PUM-DT_MAX_1234/' file > file.out
但它不起作用。
我该如何解决?
如果您想删除任何包含“PUM-DT_MAX_1234”的字段,那么您必须遍历行中的每个字段:
awk -F "[;,]" -v OFS="," 'NR==1 { next; }; { for (i=1;i<=NF;i++) { if(!match($i,/.*PUM-DT_MAX_1234.*/) && length($i) > 0) { if (i==1) r=$i; else r = r OFS $i }}; print r }' filter.txt
在带有注释的更具可读性的视图中:
-F "[;,]"
设置字段分隔符为;
或,
-v OFS=","
设置输出分隔符为,
'NR==1 { next; };
'
AWK 脚本'
开始。 剩下的就是跳过你的文件头(如果记录号是1,停下来跳到下一行{ for (i=1;i<=NF;i++) {
迭代字段数( NF
)if(!match($i,/.*PUM-DT_MAX_1234.*/) && length($i) > 0) {
如果字段不为空且与文本不匹配if (i==1) r=$i; else r = r OFS $i
if (i==1) r=$i; else r = r OFS $i
将字段连接到前一个字段(或将其设置为第一个字段以避免在输出中出现前导,
)print r }'
循环结束后,打印前一个连接的结果,并以'
结束 AWK 脚本,用于 shellfilter.txt
最后一个参数是文件名。 OFS
是频输出˚Field小号eparator,这样你就可以通过更改命令行变量改变它。
您的示例的输出:
MF00034657,M-DT_MAX_1
MF00056578,UM-DT_MAX_123
我将使用命令ls
来类比您的问题(因为它很容易实现),假设我想显示所有不是mp4
文件,您执行以下操作:
ls | awk '! /\.mp4/'
如果您想进一步使用这些选项,我实际上可能正在寻找一个不包含mp4
扩展名并且确实包含特定字符串的文件,例如abc
:
ls | awk '! /\.mp4/ && /abc/'
这应该类似于并适用于您的目的(或至少,不难实现)。
sed '1b
h;s/.*DRogan^D//;s/PUM-DT_MAX_1234;\{0,1\}//g;s/;$//;/./!d
H;g;s/,.*\n/,/' YourFile
概念:
在silgon 的回答中,该命令在我删除了 '! /.mp4/'
docker images | awk '!/\\<none>/'
docker images | awk '!/\\<none>/' | awk '{print $1,$2}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.