【问题标题】:Print last field in file and use it for name of another file打印文件中的最后一个字段并将其用作另一个文件的名称
【发布时间】:2014-05-17 00:54:13
【问题描述】:

我有一个 3 行 7 列的制表符分隔文件。我想用文件末尾的数字来重命名另一个文件。

制表符分隔文件示例:

a   b   c   d   e   f   g
a   b   c   d   e   f   g
a   b   c   d   e   f   1235

所以,我想从制表符分隔文件中提取数字,然后将“file1”重命名为提取的数字 (mv file1 1235)

我可以打印该列,但我似乎无法仅从文件中提取数字。即使我可以提取数字,我似乎也无法弄清楚如何存储该数字以用作新文件名。

【问题讨论】:

    标签: linux perl bash awk grep


    【解决方案1】:

    你可以使用这个awk

    name=$(awk 'END {print $NF}' file)
    mv file $name
    

    【讨论】:

    • @MohitJain END 部分仅在最后一行之后运行,因此最后一个字段 $NF 然后保存最后一行的最后一个数据。这存储到变量name。然后使用mv将文件重命名为变量name中的名称
    • 请注意,并非所有 awk 都会在 END 部分填充 $NF。
    • @EdMorton 在这种情况下你可以使用awk '{f=$NF} END {print f}'
    • Wellllll - 技术上应该是awk '{f=$NF ORS} END {printf "%s",f}',所以如果输入文件为空,它不会打印空行,但我认为在这种情况下这并不重要。
    【解决方案2】:

    也许是这样的?

    num=$(tail -1 file1 | rev | awk '{print $1}' | rev)
    mv file1 $num
    

    【讨论】:

    • 可以使用变量NF获取最后一个字段。
    • 使用awk你可以awk 'END{print $NF > $NF}' file或者如果文件太大,那么tac file | awk '{print $NF > $NF;exit}'
    【解决方案3】:

    使用 perl 单行代码

    perl -ne 'BEGIN{($f) = @ARGV} ($n) = /(\d+)$/; END{rename($f, $n)}' file1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 2020-05-14
      • 1970-01-01
      • 2015-02-07
      • 2016-10-10
      • 2019-02-07
      • 2017-06-02
      • 2016-01-28
      相关资源
      最近更新 更多