如果找到关键字,则在行尾添加文件名的一部分

时间:2018-08-13 16:58:49

标签: linux bash shell

我在目录中有一组文件。文件名是abc-xyz-v01abc-xyz-v02abc-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

2 个答案:

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