我有一个名为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。
您能帮我吗?
答案 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