目录下每个txt文件的行的第一列减去一个常量

subtract a constant number from the first column of the rows of each txt file in the directory

我在一个目录中有数千个 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 替换为 n-1。例如,在这种情况下,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 循环,但似乎应该有更简单的方法

每第一个字段减一:

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

rm -f tmp

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

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

使用awk,您可以运行以下命令从column1

中减去1
awk '{=-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

thousands of txt files in a directory

您可以利用 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;print}' file*.txt

将这些文件分别更改为

0 2 3
3 5 6

6 8 9

9 11 12

解释:将 (-=) 第 1 列 (</code>) 的值减少 <code>1,然后 print

(在 GNU Awk 5.0.1 中测试)

can use a for loop in python but it seems there should be an easier way

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

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

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