我想在特定列中提取具有特定模式的行。例如,在我的“ input.txt”文件中,我有很多列。我想在第25列中搜索“ foobar”,并仅提取在第25列中具有“ foobar”的行。我做不到:
grep foobar input.txt
因为其他列也可能有“ foobar”,我不希望这些行。另外:
换句话说,如果第25列包含以下行:
我只需要第1行和第2行。
如何使用xargs和sed提取这些行?我被困在:
cut -f25 input.txt | grep -nw foobar | xargs -I linenumbers sed ???
谢谢!
答案 0 :(得分:0)
请勿使用xargs和sed,请使用许多计算机上常见的其他工具,并执行以下操作:
Start
awk '{if($25=="foobar"){print NR" "$0}}' input.txt
打印当前匹配项的行号,因此输出的第一列将是行号。
print NR
打印当前行。如果只需要匹配的列,请将其更改为print $0
。如果只需要输出,请使用以下命令:
print $25
EDIT1以匹配扩展问题: 使用@shellter和@Jotne建议的内容,但添加字符串定界符。
awk '{if($25=="foobar"){print $0}}' input.txt
awk -vFPAT="([^ ]*)|('[^']*')" -vOFS=' ' '$25~/foobar/' input.txt
匹配所有非空格字符。
[^ ]*
匹配单引号内的所有内容。
EDIT2排除除'[^']*'
之外的所有内容:
foobar
awk -vFPAT="([^ ]*)|('[^']*')" -vOFS=' ' "\$25~/[;' ]foobar[;' ]/" input.txt
仅在foobar的前面和后面允许[;' ]
,;
和'
。
对此文件进行了测试:
和此命令1 "1 ; 1" 4
2 'kom foobar' 33
3 "ll;3" 3
4 '1; foobar' asd
7 '5 ;foobar' 2
7 '5;foobar' 0
2 'kom foobar35' 33
2 'kom ; foobar' 33
2 'foobar ; john' 33
2 'foobar;paul' 33
2 'foobar1;paul' 33
2 'foobarli;paul' 33
2 'afoobar;paul' 33
答案 1 :(得分:0)
要获得25字段中带有foobar
的行。
awk '$25=="foobar"' input.txt
$25
于25日提交
==
等于
"foobar"
由于没有具体动作,所以将完成打印完整行,与{print $ 0}
或
awk '$25~/^foobar$/' input.txt
答案 2 :(得分:0)
这可能对您有用(GNU sed):
sed -En 's/\S+/\n&\n/25;s/\n(.*foobar.*)\n/\1/p' file
用换行符包围第25个字段,并在换行符之间对foobar
进行模式匹配。
如果您只想匹配单词foobar
,请使用:
sed -En 's/\S+/\n&\n/25;s/\n(.*\<foobar\>.*)\n/\1/p' file