用文件名linux的一部分替换文件中的列

时间:2013-11-19 18:26:24

标签: linux replace find

我有以下方式命名的数千个文件:

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中轻松地同时为我的所有数千个文件执行此操作?

谢谢, 金佰利

2 个答案:

答案 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