【问题标题】:bash script, modifying a filebash脚本,修改文件
【发布时间】:2012-10-02 06:29:44
【问题描述】:

这是我的脚本:

#!/bin/bash


for i in *.csv
do
        echo "i: $i"
        THE_FILE2="$i-2.csv"

        file_read()
        {
                lineno=0
                while read line
                do
                        echo $line | awk -F, '{print $1","$2",,,"$3","$4}'
                        ((lineno++))
                done
        } < $i > $THE_FILE2
        echo "the_file2: $THE_FILE2"
        echo "end"
done

file_read

输出:

i: 2992.csv
the_file2: 2992.csv-2.csv
end
i: 5415.csv
the_file2: 5415.csv-2.csv
end
i: csa.csv
the_file2: csa.csv-2.csv
end
i: loc.csv
the_file2: loc.csv-2.csv
end
i: visa.csv
the_file2: visa.csv-2.csv
end

$ ls
2992.csv       csa.csv        transform.sh   visa.csv-2.csv
5415.csv       loc.csv        visa.csv

不幸的是,它只对列表中的最后一个文件执行此操作。它跳过了所有其他的。我有一种感觉,这与缓冲或通配或其他东西有关。我错过了什么?

【问题讨论】:

  • 为什么要在脚本中逐行读取文件?默认情况下,Awk 会为您执行此操作。 awk -F, '{print $1","$2",,,"$3","$4}' $i &gt; $THE_FILE2 可能会做你想做的事(未经测试)

标签: linux bash shell file-io scripting


【解决方案1】:

您在循环内部定义了file_read,然后从外部调用它。

应该是相反的!

您可能希望将一些值作为参数传递给file_read

【讨论】:

  • 在这种情况下我会完全摆脱这个功能。
  • 在上面给出的示例中,这可能是一个很好的解决方案 - 它足够小,可以保持内联,而不会过多地混淆代码。
【解决方案2】:

不需要file_read 函数。只需将该代码直接放在 for 循环中即可。

另外,为什么要使用 shell 的 read 命令,然后将其回显到每行的新 awk 命令?您可以将整个文件重定向到 awk,它会自动读取每一行。

你正在增加lineno,但没有将它用于任何事情。如果您需要未显示的内容的行号,可以使用 awk 的 NR 变量。

for i in *.csv
do
        echo "i: $i"
        THE_FILE2="$i-2.csv"
        awk -F, '{print $1","$2",,,"$3","$4}' < $i > $THE_FILE2
        echo "the_file2: $THE_FILE2"
        echo "end"
done

【讨论】:

    【解决方案3】:

    不幸的是,它只对列表中的最后一个文件执行此操作。

    那是因为你只在循环之后调用了一次file_read。它只对最后一个文件执行它,因为变量iTHE_FILE2 保留在循环的最后一次迭代中。

    这是一个awk 解决方案:

    awk -f - *.csv << 'EOD'
    BEGIN { OFS = FS = "," }
    {
        out = FILENAME "-2.csv"
        print $1,$2,",",$3,$4 >> out
    }
    EOD
    

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多