如何从txt文件中grep列,并在shell脚本中重定向到另一个文本文件



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|2222cut命令根据分隔符选择列,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参数的任何内容分隔——并将列作为文本输出。

最新更新