在Linux中转换文本文件

时间:2013-05-03 19:10:10

标签: linux shell

我有一个文本文件,其中field1; field2; field3在一行中。 我需要生成另一个只包含3个字段的文件,例如:

原件:

yast2-storage-lib;2.13.108-0.4.226;
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.112-0.6.1;
yast2-storage;2.13.108-0.4.226;
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1

期望的结果:

yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1

有人能帮助我吗?我现在已经进行了几个小时的测试,但是我无法产生所需的结果,而且我的文本转换技能几乎没有,我所能看到的。 我尝试了'grep','awk'和'sed',但正如我所说,我缺少exp。

5 个答案:

答案 0 :(得分:2)

grep ';.*;.'

选择所有包含至少两个分号的行,两者之间的任何内容以及第二个分号后的至少一个字符。您可能需要修剪掉空格。

答案 1 :(得分:2)

如果您确定没有尾随空格:

awk -F\; \$3 file.txt

如果你这样做:

awk -F\; '$3~/\S/' file.txt

或者无法识别\S

awk -F\; '$3~/[^ \t]/' file.txt

使用;作为字段分隔符,如果第三个字段非空,则打印该行。

答案 2 :(得分:2)

使用sed删除以;

结尾的所有行
sed '/;$/d'

答案 3 :(得分:0)

你和awk走在正确的轨道上。在awk $ N中是字段,因此要在您键入的命令行上打印第一个和第三个字段

awk '{print $1, $3}' <input file> > <output file>

根据具体要求,还有其他方法可以做到这一点。如果您需要在诸如版本的行上搜索图案,然后打印特定字段,则使用

awk '/pattern/ {print $1, $3}' <input file> > <output file>

我首先浏览herehere。在那之后,我会通过awk / gawk单行查看,因为您可能需要做的事情可以用一行完成。它可能看起来像你走过键盘,但它可以节省你数小时的繁琐工作。

答案 4 :(得分:0)

这个怎么样?

$ cat yast 
yast2-storage-lib;2.13.108-0.4.226;
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.112-0.6.1;
yast2-storage;2.13.108-0.4.226;
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1
$ awk -F";" '{for(i=2;i<=NF;i++){if(!b[$i]&&$NF!=""){b[$i]=$i;if(length(s)>0){s=s";"$i}else{s=$i}}};a[$1]=$1";"s}END{for(i in a){print a[i]}}' yast 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1