xargs和sed提取特定行

时间:2019-07-24 23:10:32

标签: sed grep xargs

我想在特定列中提取具有特定模式的行。例如,在我的“ input.txt”文件中,我有很多列。我想在第25列中搜索“ foobar”,并仅提取在第25列中具有“ foobar”的行。我做不到:

grep foobar input.txt

因为其他列也可能有“ foobar”,我不希望这些行。另外:

  1. 第25列将'foobar'作为字符串的一部分(即可能是'foobar; muller'或'max; foobar; john'或'tom; foobar35')
  2. 我不想要'tom; foob​​ar35'
  3. 第25列中的单词必须与'foobar'(和;完全匹配),因此不能使用awk $ 25 =='foobar'。

换句话说,如果第25列包含以下行:

  1. foobar;穆勒
  2. max; foob​​ar;约翰
  3. tom; foob​​ar35

我只需要第1行和第2行。

如何使用xargs和sed提取这些行?我被困在:

cut -f25 input.txt | grep -nw foobar | xargs -I linenumbers sed ???

谢谢!

3 个答案:

答案 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