我有一个文本文件,其中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。
答案 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>
我首先浏览here和here。在那之后,我会通过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