【问题标题】:Bash: how to change first column of a file and only the first columnBash:如何更改文件的第一列并且仅更改第一列
【发布时间】:2013-03-11 21:19:06
【问题描述】:

我有一个文件被程序搞砸了,现在每一行看起来都像这样:

somelongstring:number   number    number   number   ... a lot more columns

(制表符分隔) 我需要做的是修改每一行,以便第一列,如果它的格式为 somelengthystring:number,则更改为只是数字(去掉字符串和冒号)

我知道我可以在 awk 中使用 split 来摆脱字符串和冒号,例如:

awk '{
   split($1,array,":")
} 
END{
   print array[2],$2,$3...
}'

但问题是我不只想要第一列。我想要整行,只想修复第一列。唯一的问题是列太多了,打出 $2,$3, ... 一直到 $35 或其他什么的都是相当愚蠢的。有什么更好的方法来解决这个问题?

【问题讨论】:

  • somelongstring 里面有空格吗?
  • 可能。据我所知,不,也不应该。但文件大小约为 500MB,因此无法检查每一行。
  • 如果它有空格或冒号,它会变得多毛。我正在考虑如何处理这些情况。

标签: linux bash scripting awk text-parsing


【解决方案1】:

使用sed。删除从行首 (^) 到第一个冒号的所有字符。

sed 's/^[^:]*://' infile

【讨论】:

    【解决方案2】:

    使用 Perl 你可以做到这一点:

    cat file.txt | perl -pe 's/.*?://'
    

    【讨论】:

      【解决方案3】:

      如果到目前为止你所拥有的,除了 $2, .... 部分:

      awk '{
          split(..)
          $1=array[2]
          print
      }'
      

      【讨论】:

        【解决方案4】:

        使用cut

        cut -d: -f2- file.txt
        

        这使用冒号作为分隔符并将所有内容保留在它的右侧。

        【讨论】:

          【解决方案5】:

          如果只更改第一个制表符分隔字段中的格式somelengthystring:number,您可以试试这个:

          awk '$1~/:[0-9]*$/{sub(/.*:/,x,$1)}1' FS='\t' OFS='\t' file
          

          【讨论】:

            猜你喜欢
            • 2010-10-07
            • 2018-02-21
            • 2015-09-23
            • 1970-01-01
            • 2013-06-09
            • 2019-03-24
            • 1970-01-01
            • 1970-01-01
            • 2019-08-21
            相关资源
            最近更新 更多