我在目录中有一组文件。文件名是abc-xyz-v01
,abc-xyz-v02
,abc-xyz,v03
,依此类推。在文件中,如果存在关键字“ name
”,那么我必须在文件名的末尾附加例如该行中的v01
。
这是我编写的代码,可以正常工作,但是还有什么更优雅,更好的解决方案。我是bash脚本的新手。
#!/bin/bash
# fileinfo.sh
FILES="/home/user/data/test/*"
for file in $FILES
do
echo "$file"
x=0
first=1
linenum=$(awk '/name/{ print NR; exit }' $file)
substr=$(echo $file | cut -d'-' -f 3)
cat $file | while read line; do
x=$(( x+1 ))
if [ $x -eq $first ]
then echo $line > temp.txt
elif [ $x -eq $linenum ]
then echo $line-$substr >> temp.txt
else
echo $line >> temp.txt
fi
done
mv temp.txt $file
done
答案 0 :(得分:0)
用于文件
$ cat abc-xyz-v01
1
2
name
4
5
这会产生
$ awk '/name/{n=split(FILENAME,a,"-"); $0=$0 "-" a[n]}1' abc-xyz-v01
1
2
name-v01
4
5
您可以编写循环
$ for f in ...
do awk ... "$f" > tmp && mv tmp "$f";
...
done
不确定没有匹配项时要做什么,但是很容易向awk
添加退出状态并以此为条件。
答案 1 :(得分:0)
使用gnu-awk
,可以在一个单一的命令中完成:
awk -i inplace '/name/{split(FILENAME, a, "-"); $0 = $0 "-" a[3]} 1' abc-xyz-v0{1..3}