我有以下方式命名的数千个文件:
Track_0000000_extract.txt
其中零可以用任何数值替换。
这些文件的内容如下所示:
1 0 138.7936 26.4674 -1.517 7.225 0 1 95564.477 100997.425 267127.576 44.585 215803.887
1 6 138.4649 27.8692 -2.318 4.902 0 1 96308.418 101000.391 240804.857 40.122 239866.492
1 12 137.956 28.8204 -2.196 6.239 0 1 96602.983 100980.098 193555.58 43.644 227623.588
1 18 137.4698 30.031 -2.734 6.457 0 1 96763.473 100962.086 189049.294 42.996 132256.485
1 24 136.857 31.2838 -2.595 1.886 0 1 97331.108 100934.865 120323.785 39.545 177050.848
1 30 136.2677 31.6498 -5.708 -2.484 0 1 97295.779 100920.752 144810.457 37.85 23238.046
我想用文件名中的数值替换每个文件的第一列中的数字1。是否可以在linux shell中轻松地同时为我的所有数千个文件执行此操作?
谢谢, 金佰利
答案 0 :(得分:3)
单行:
find -name 'Track*_extract.txt' | \
cut -d_ -f2 | \
xargs -n 1 -I @ sed -i 's!^[^ ]*!'@'!' Track_@_extract.txt
答案 1 :(得分:2)
这将创建扩展名为.new
的文件,其中第一列被数值替换。
#!/bin/sh
for file in Track_*_extract.txt
do
num=${file#Track_}
num=${num%_extract.txt}
awk -v num=$num '{ $1=num; print }' < $file > $file.new
done
如果你想要将第一列中的数字替换为数字值,只有它是数字1 - 我不清楚你想要什么 - 然后使用它:
#!/bin/sh
for file in Track_*_extract.txt
do
num=${file#Track_}
num=${num%_extract.txt}
awk -v num=$num '{ if ($1 == 1) { $1=num }; print }' < $file > $file.new
done