2013-05-03 91 views
0

我有一个文本文件,field1; field2; field3在一行中。 我需要制作一个只包含3个字段,例如下面的其他文件:在Linux中转换文本文件

原文:

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。

回答

0

你在awk的正确轨道上。在AWK $ N是字段,以便打印的第一和第三场例如在命令行应键入

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

有这样做取决于具体要求的其他方式。如果您需要寻找线路上的图案,如版本,然后打印特定的字段你应该使用

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

我会通过herehere浏览开始。在那之后,我会通过awk/gawk单行程来查看你可能需要做的事情。它可能看起来像你的猫走过键盘,但它可以节省你几个小时的繁琐工作。

+0

[UUoCA](http://partmaps.org/era/unix/award.html ) – 2013-05-03 19:35:05

+0

嗨,麦凯,谢谢你的支持。 我测试了你的解决方案,但我总是得到这个: cat sles10.4-updates.txt | awk {print $ 1,$ 3}> teste awk:cmd。行:1:{print awk:cmd。行:1:^意外的换行符或字符串的结尾 但是,谢谢你提供了命令执行的完整解释。我肯定会探讨这一点,因为我现在需要做这样的工作。 我在我的搜索过程中偶然发现了这个网站,我从未期待过你和其他人做出如此快速的回应。 根据我对正确答案的想法给予学分,但所有人对帮助我都很棒。 – Maggo 2013-05-04 03:23:22

+0

不要在这种情况下使用猫,它会工作,但这是一个不好的习惯,通常是不必要的。 – Matty 2013-05-06 11:15:13

2
grep ';.*;.' 

选择所有包含至少两个分号的行,其间的任何内容以及第二个分号后的至少一个字符。您可能不得不修剪线条上的空格。

+0

嗨Larsmans,感谢您的支持。 这按要求工作,谢谢。 JG – Maggo 2013-05-04 03:09:57

2

如果你确定你没有尾随空白:

awk -F\; \$3 file.txt 

如果你这样做:

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

或者awks不承认\S

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

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

+0

嗨凯文,感谢您的支持。 第一个选项按需要工作,第二个选项没有。我只是想你想知道。 – Maggo 2013-05-04 03:07:01

+0

@ user2348098看起来默认的mac/bsd awk不能识别'\ S',我添加了非gnu兼容版本 – Kevin 2013-05-04 03:15:22

2

使用SED删除在;

sed '/;$/d' 
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 
+0

@ user2348098:你试过这个吗? – tink 2013-05-05 08:54:49