【问题标题】:subtract a constant number from the first column of the rows of each txt file in the directory [closed]从目录中每个txt文件的行的第一列中减去一个常数[关闭]
【发布时间】:2021-12-25 06:58:02
【问题描述】:

我在一个目录中有数千个 txt 文件,例如axk.txt 如下

1 0.3 0.9 1 0.87 0.95 2 
45 0.5 0.2 12 0.25 0.34 98
23 0.99 0.45 134 0.36 0.2 92

我正在尝试用n-1 替换每行中的第一个元素n。例如,在这种情况下,axk.txt 变成了

0 0.3 0.9 1 0.87 0.95 2 
44 0.5 0.2 12 0.25 0.34 98
22 0.99 0.45 134 0.36 0.2 92

在 bash 中是否有一种简单的方法可以做到这一点?我可以在 python 中使用 for 循环,但似乎应该有更简单的方法

【问题讨论】:

    标签: python bash awk


    【解决方案1】:

    每个第一个字段减一个:

    for i in *.txt; do
        awk '$1 ~ /^\.?[0-9]/ {$1 = $1 - 1}
             {print}' \
            "$i" > tmp &&
        mv tmp "$i"
    done
    
    rm -f tmp
    

    这会在修改字段之前检查字段是否为数字(不是字符串)。如果您不需要担心这一点,您可以删除 awk 模式 $1 ~ /^\.?[0-9]/。如果$1 是一个字符串,$1-1 的计算结果为负整数 (-1)。

    awk 也将超过零,变为负数。 0.5 变为 -0.5 等等。如果您不希望数字变为负数,可以将整个模式更改为 $1+0 >= 1(如果 $1 是字符串,则 $1+0 的计算结果为零)。

    【讨论】:

    • 谢谢,这行得通
    【解决方案2】:

    使用awk,您可以运行以下命令从 column1 中减去 1

    awk '{$1=$1-1}1' input_file
    0 0.3 0.9 1 0.87 0.95 2
    44 0.5 0.2 12 0.25 0.34 98
    22 0.99 0.45 134 0.36 0.2 92
    

    【讨论】:

      【解决方案3】:

      一个目录下上千个txt文件

      您可以利用 GNU AWK 的 -i inplace 轻松更改许多文件,让 file1.txt 内容成为

      1 2 3
      4 5 6
      

      和file2.txt的内容是

      7 8 9
      

      和file3.txt的内容是

      10 11 12
      

      然后

      awk -i inplace '{$1-=1;print}' file*.txt
      

      确实将这些文件分别更改为

      0 2 3
      3 5 6
      

      和

      6 8 9
      

      和

      9 11 12
      

      说明:将 (-=) 第一列 ($1) 的值减少 1,然后减少 print。

      (在 GNU Awk 5.0.1 中测试)

      可以在 python 中使用 for 循环,但似乎应该有更简单的方法

      您可能会发现 fileinput 内置模块很有用,它也有 inplace 选项,但是它只是为您提供字符串作为字符串,所以如果您希望从中解析数字,您需要这样做自己。

      【讨论】:

        【解决方案4】:

        在普通 bash 中,假设第一个字段始终是整数:

        while read -r n rest; do echo "$((n-1)) $rest"; done < file.txt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-12
          • 2021-08-13
          • 2014-08-22
          • 2022-01-24
          • 2021-10-28
          • 1970-01-01
          • 2011-03-23
          • 1970-01-01
          相关资源
          最近更新 更多