file1.txt具有以下内容,用":-
a|b|c|d|e
1|11|111|1111|11111
2|22|222|2222|22222
3|33|333|3333|333333
4|44|444|4444|44444
如何只对a、c和d列进行grep并重定向到另一个文件file2.txt?
根据您的具体需求,有几个选项。
提取列,然后进行筛选
最简单的是,如果您只想在输出中使用2|222|2222
。cut
命令根据分隔符选择列,grep
处理行。
cut -f1,3,5 -d'|' infile.txt | grep '2222' > outfile.txt
然而,如果您需要找到3
,但而不是3333
,那么这将是一个小问题。您可能希望使用grep -w
只搜索完整的单词,但如果您试图查找子字符串,也可能不这样做。
变化,更好的搜索
如果您愿意在多行中工作,并且希望从源文件输出整行,则可以向grep
询问行号。
for line in $(cut -f3 -d'|' infile.txt | grep -wn '222' | cut -f1 -d':')
do
sed -n "${line}p" infile.txt > outfile.txt
done
有很多方法可以获得文件的第307行,但sed -n '307p'
可能是最可读的,也是最容易扩展到一系列行的方法,方法是将数字更改为逗号分隔的对,如'300,310p'
。
使用awk
维基百科将awk
描述为…
。。。为文本处理而设计的一种特定于领域的语言,通常用作数据提取和报告工具。
。。。因此,它非常适合这类工作,即使它有更困难的学习曲线。在这里,你需要真正学习语言或提供关于你想要什么的更广泛的细节(最好是在一个新问题中,以防止范围蔓延,在这里(,但以下内容应该让你开始。
awk -F| '{ if ($4 == "2222") print $0 }' infile.txt > outfile.txt
-F
参数是字段分隔符/分隔符,语言中的$*
项是字段,$0
是整行。
仅列
在评论中快速讨论后,如果您只想要文件中的特定列,这只是第一个解决方案的一部分。
cut -f1,3,5 -d'|' infile.txt > outfile.txt
在这种情况下,cut
只接受逗号分隔的列列表——用输入-d
参数的任何内容分隔——并将列作为文本输出。