如何使用bash脚本修改多个文件

时间:2018-12-06 15:54:39

标签: linux bash awk scripting

我有一个名为script.sh的文件,其中包含以下代码:

#!/bin/bash

file=list.txt
IFS=$','
cat $file 
for i in `cat $file`
do
    echo "The name of the file I am going edit is $i"
    awk 'BEGIN{FS=OFS=","} /^\<AA_xx\>/||/^\<AA\>/{$160="CC,0,DD,0"} 1' $i \
        > temp_file.csv && mv temp_file.csv $i
done

list.txt包含.csv文件的路径,例如/ws/user/stack.csv

但是,我想修改此脚本以读取我在list.txt中指定的所有文件,即我的list.txt包含

/ws/user/stack.csv
/ws/user/stack1.csv
/ws/user/stack2.csv

我希望脚本在list.txt中提到的每个文件中使用此awk。

您能帮我吗?

2 个答案:

答案 0 :(得分:0)

以下是技巧

script.sh

#!/bin/bash
while read -r line; do
    cat "$line" | awk '{print $0}' > "output_$line"
done < "$1"

然后您只需用

$ ./script.sh list.txt

如果您的awk代码很大,建议您将其组织在一个函数中。

script.sh

#!/bin/bash
yourAwkFunction(){
    awk '{print $0}'
}

while read -r line; do
    cat "$line" | yourAwkFunction > "output_$line"
done < "$1"

line是接收list.txt每行值的变量。这意味着line对于第一次迭代是/ws/user/stack.csv,然后对于第二次迭代是/ws/user/stack.csv1,依此类推。

有关读取文件行的​​更多信息,请检查http://mywiki.wooledge.org/BashFAQ/001

答案 1 :(得分:0)

由于您的评论说list.txt由换行符分隔,因此请按照此处逐行读取文件的方法:Read a file line by line assigning the value to a variable

哪个会给你:

#!/bin/bash

while IFS='' read -r file || [[ -n "$file" ]]; do
  echo "The name of the file I am going edit is $file"
  awk 'BEGIN{FS=OFS=","} /^\<AA_xx\>/||/^\<AA\>/{$160="CC,0,DD,0"} 1' $file \
    > temp_file.csv && mv temp_file.csv $file
done < list.txt