【问题标题】:Bash decrease all integers in delimited file by onebash逐个减少分隔文件中的所有整数
【发布时间】:2014-09-25 06:43:26
【问题描述】:

我有一个仅包含整数的空格分隔文件。每行都有从 1 开始的不同数量的整数。有没有一种方法可以使用一个 awk、sed、grep 或任何组合来实际创建另一个文件,该文件与所有整数减一时完全相同?该文件也没有空行。

输入文件示例:

2 3 4 5 6 7
1 3 5

输出文件示例:

1 2 3 4 5 6
0 2 4

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

    你可以试试这个 awk 命令,

    awk '{for(i=1;i<=NF;i++){$i=$i-1}}1' infile > outfile
    

    示例:

    $ cat file
    2 3 4 5 6 7
    1 3 5
    
    4 4 5
    $ awk '{for(i=1;i<=NF;i++){$i=$i-1}}1' file
    1 2 3 4 5 6
    0 2 4
    
    3 3 4
    

    【讨论】:

    • 完美。我赞成你的回答。我也会接受的
    【解决方案2】:

    您可以在 Bash 循环中通过将文件的每一行读入一个数组来执行此操作。

    while read -ra line; do
        for i in ${!line[@]}; do
            let line[$i]--
        done
        echo ${line[@]}
    done < file > output_file
    

    【讨论】:

    • 这似乎也很复杂。学习新东西还是不错的。为您的努力 +1。
    【解决方案3】:
    for DD in $(cat your_input_file|tr " " ",")
    do
       for x in $(echo $DD | tr "," " ")
       do
          let m=$x-1
          echo -n " $m" >>your_output_file
       done
       echo >>your_output_file
    done
    

    但@Avinash Raj 的建议更好

    【讨论】:

    • 看起来很复杂。仍然为您的努力 +1。
    • UNIX shell 是一个调用工具的环境。操作文本文件内容的标准 UNIX 工具是 awk。每当您发现自己在 shell 中编写循环来操作文本文件的内容时,您的方法都是错误的,最终结果总是比 awk 解决方案更长、更复杂、更慢和/或更不健壮。
    • @Ed Morton,我完全同意你的看法。然而,当您需要处理文本文件并运行一些程序时,存在相当大的问题。因此请记住,您也可以在 shell 中进行相同的操作,但您说得对,这很尴尬。
    【解决方案4】:

    perl 版本:

    perl -pe 's/(\d+)/$1-1/eg' file
    1 2 3 4 5 6
    0 2 4
    

    说明:

    • -p 假设 while (&lt;&gt;) { ... } 循环程序并打印该行,就像 sed 一样。
    • -e 执行代码
    • s/(\d+)/$1-1/eg 是一个简单的替换,我们将每个数字分组并对其执行减法。 e 标志评估替换。 g 标志执行全局替换。

    【讨论】:

    • +1,虽然我自己是一名 Pythonista,但始终喜欢爷爷 perl 解决方案 ;-)
    猜你喜欢
    • 2014-02-10
    • 2012-09-03
    • 2015-05-21
    • 2020-12-09
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多