xargs 和 sed 提取特定行

xargs and sed to extract specific lines

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

grep foobar input.txt

因为其他列也可能有 'foobar',我不想要这些行。还有:

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

换句话说,如果第 25 列有以下几行:

  1. foobar;穆勒
  2. 最大值; foob​​ar ;约翰
  3. 汤姆; foob​​ar35

我只想要第 1 和第 2 行。

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

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

谢谢!

不要使用 xargs 和 sed,使用许多机器上通用的其他工具并执行此操作:

awk '{if(=="foobar"){print NR" "[=10=]}}' input.txt

print NR 打印当前匹配的行号,因此输出的第一列将是行​​号。 print [=16=] 打印当前行。如果您只需要匹配的列,请将其更改为 print 。如果你只想要输出,使用这个:

awk '{if(=="foobar"){print [=11=]}}' input.txt

EDIT1 以匹配扩展问题: 使用@shellter 和@Jotne 建议的内容,但添加字符串定界符。

awk -vFPAT="([^ ]*)|('[^']*')" -vOFS=' ' '~/foobar/' input.txt 

[^ ]* 匹配所有不是 space 的字符。 '[^']*' 匹配单引号内的所有内容。

EDIT2 排除除 foobar 之外的所有内容:

awk -vFPAT="([^ ]*)|('[^']*')" -vOFS=' ' "$25~/[;' ]foobar[;' ]/" input.txt

[;' ]只允许;'</code>在foobar前后。</p> <p>使用此文件测试:</p> <pre><code>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

和这个命令awk -vFPAT="([^ ]*)|('[^']*')" -vOFS=' ' "$2~/[;' ]foobar[;' ]/" input.txt

获取包含 foobar 的行作为 25 字段的一部分。

awk '=="foobar"' input.txt

</code>第25个提交<br> <code>==等于
"foobar"
由于没有指定操作,打印完整行将完成,与 {print $0}

相同

awk '~/^foobar$/' input.txt

这可能适合您 (GNU sed):

sed -En 's/\S+/\n&\n/25;s/\n(.*foobar.*)\n//p' file

用换行符包围第 25 个字段,并在换行符之间匹配 foobar 的模式。

如果您只想匹配单词 foobar,请使用:

sed -En 's/\S+/\n&\n/25;s/\n(.*\<foobar\>.*)\n//p' file