xargs 和 sed 提取特定行
xargs and sed to extract specific lines
我想在特定列中提取具有特定模式的行。例如,在我的 'input.txt' 文件中,我有很多列。我想在第 25 列中搜索 'foobar',并仅提取第 25 列中具有 'foobar' 的那些行。我做不到:
grep foobar input.txt
因为其他列也可能有 'foobar',我不想要这些行。还有:
- 第 25 列将 'foobar' 作为字符串的一部分(即它可以是 'foobar ; muller' 或 'max ; foobar ; john',或 'tom ; foobar35')
- 我不想 'tom ; foobar35'
- 第 25 列中的单词必须与 'foobar' 完全匹配(并且 ; 因此不能使用 awk $25=='foobar'。
换句话说,如果第 25 列有以下几行:
- foobar;穆勒
- 最大值; foobar ;约翰
- 汤姆; foobar35
我只想要第 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
我想在特定列中提取具有特定模式的行。例如,在我的 'input.txt' 文件中,我有很多列。我想在第 25 列中搜索 'foobar',并仅提取第 25 列中具有 'foobar' 的那些行。我做不到:
grep foobar input.txt
因为其他列也可能有 'foobar',我不想要这些行。还有:
- 第 25 列将 'foobar' 作为字符串的一部分(即它可以是 'foobar ; muller' 或 'max ; foobar ; john',或 'tom ; foobar35')
- 我不想 'tom ; foobar35'
- 第 25 列中的单词必须与 'foobar' 完全匹配(并且 ; 因此不能使用 awk $25=='foobar'。
换句话说,如果第 25 列有以下几行:
- foobar;穆勒
- 最大值; foobar ;约翰
- 汤姆; foobar35
我只想要第 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