目录下每个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
我在一个目录中有数千个 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
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