0

我有一个文本文件,其中 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。

4

5 回答 5

2
grep ';.*;.'

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

于 2013-05-03T19:14:07.503 回答
2

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

awk -F\; \$3 file.txt

如果你这样做:

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

或者不认识的awks \S

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

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

于 2013-05-03T19:20:33.187 回答
2

使用 sed 删除所有以 a 结尾的行;

sed '/;$/d'
于 2013-05-03T19:38:21.187 回答
0

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

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

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

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

我会先浏览这里这里。之后,我会查看 awk/gawk 单行代码,因为您可能需要做的很多事情都可以通过一行代码来完成。它可能看起来像你的猫走过键盘,但它可以为你节省数小时的繁琐工作。

于 2013-05-03T19:24:22.937 回答
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
于 2013-05-03T20:11:53.580 回答