我的服务器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
但不工作
任何建议
谢谢!
答案 0 :(得分:15)
答案 1 :(得分:2)
如果我理解您的问题,您希望删除任何包含" 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
将字段连接到上一个字段(或者只设置第一个字段以避免输出中的前导字段)print r }'
一旦循环结束,打印上一个连接的结果,并以'
为shell结束awk脚本filter.txt
最后一个参数是文件名。 OFS
是 O 输出 F ield S eparator,因此您可以通过更改命令中的变量来更改它线。
例子的输出:
MF00034657,M-DT_MAX_1
MF00056578,UM-DT_MAX_123
答案 2 :(得分:1)
sed '1b
h;s/.*DRogan^D//;s/PUM-DT_MAX_1234;\{0,1\}//g;s/;$//;/./!d
H;g;s/,.*\n/,/' YourFile
概念: - 保留一行副本 - 从线上移除头部和任何PUM,检查是否有东西停留 - 返回标题(从缓冲行)并使用reduce行重新格式化
答案 3 :(得分:1)
我将使用命令ls
对你的问题进行类比(因为它很容易实现),假设我想要显示所有不是mp4
的命令,你可以执行以下操作:
ls | awk '! /\.mp4/'
如果您想进一步了解这些选项,我实际上可能正在寻找 不 包含mp4
扩展名的文件< strong> 包含特定字符串,例如abc
:
ls | awk '! /\.mp4/ && /abc/'
这应该是类似的,适用于您的目的(或者至少,不难实施)。
答案 4 :(得分:0)
在上面的答案@silgon中,该命令在我删除'!中的空格后起作用了! /.mp4 /'
docker images | awk '!/\<none>/'
docker images | awk '!/\<none>/' | awk '{print $1,$2}'