【问题标题】:Transforming a text file in Linux在 Linux 中转换文本文件
【发布时间】:2013-04-28 06:34:20
【问题描述】:

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

【问题讨论】:

    标签: linux shell


    【解决方案1】:
    grep ';.*;.'
    

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

    【讨论】:

    • 您好 Larsmans,感谢您的支持。这按要求工作,谢谢。 JG
    【解决方案2】:

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

    sed '/;$/d'
    

    【讨论】:

      【解决方案3】:

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

      awk -F\; \$3 file.txt
      

      如果你这样做:

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

      或者无法识别\S的awk:

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

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

      【讨论】:

      • 嗨,凯文,感谢您的支持。第一个选项按要求工作,第二个没有。我只是想你想知道。
      • @user2348098 看来默认的mac/bsd awk 无法识别\S,我添加了一个不兼容gnu 的版本
      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 您好,Mathy,感谢您的支持。我已经测试了你的解决方案,但我总是得到这个:cat sles10.4-updates.txt | awk {print $1, $3} >teste awk: cmd.行:1:{打印 awk:cmd。 line:1: ^ 意外的换行符或字符串结尾但是感谢您为命令的实现提供了完整的解释。我肯定会对此进行探索,因为我现在需要执行此类任务。我只是在搜索过程中偶然发现了这个网站,我没想到你和上面的其他人会这么快做出回应。根据我对正确答案的想法给予学分,但在帮助我方面都很棒。
      • 在这种情况下不要使用 cat,它会起作用,但这是一个坏习惯,通常是不必要的。
      【解决方案5】:

      这个怎么样?

      $ 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
      

      【讨论】:

      • @user2348098:你试过了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2019-08-21
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多