【问题标题】:How to modify multiple files using a bash script如何使用 bash 脚本修改多个文件
【发布时间】:2019-05-08 08:52:36
【问题描述】:

我有一个名为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。

你能帮我解决这个问题吗?

【问题讨论】:

  • 你在说什么是这里的问题?你是说 lilst.txt 没有被正确阅读吗?我你设置IFS=","。 list.txt 中的文件名是逗号分隔还是换行符分隔?如果换行符分开,结帐stackoverflow.com/questions/10929453/…
  • 换行符分隔

标签: linux bash awk scripting


【解决方案1】:

由于您的评论说 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

【讨论】:

  • 如何运行脚本?只是 ./script.sh?
  • 没错。在这里,我只是硬编码 list.txt 作为输入。您也可以使用"$1" 代替上面的list.txt 并使用./script.sh list.txt 运行
  • 我要编辑的文件的名称是/ws/user/stack.csv 我要编辑的文件的名称是/ws/user/stack1.csv 我要编辑的文件的名称我要编辑的是 mv:在temp_file.csv' Try mv --help' 之后缺少目标文件操作数以获取更多信息。
  • 我要编辑的文件名的第三行是空的..然后它说操作数中缺少目标文件
  • 这是因为它试图将 temp.csv 移动到 /ws/user/stack.csv .. 这是一个无效的位置。如何转到上面的一个目录
【解决方案2】:

以下方法可以解决问题

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

【讨论】:

  • 这会处理每个文件的换行吗?我不需要 IFS 对吧?
  • 我已经用 list.txt 进行了测试,其中每一行对应一个文件名并且它有效。如果你有一个换行符分隔的 list.txt,你不需要指定 IFS
  • 什么是 line 和 $line?
  • 我已经在回答中澄清了
  • 如何在这里修改我的 awk 函数? $i \ > temp_file.csv && mv temp_file.csv $i 那么在这种情况下 $i 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2013-03-27
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多