0

这是我的脚本:

#!/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

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

4

3 回答 3

3

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

应该是反过来的!

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

于 2012-10-02T06:39:25.497 回答
1

不需要这个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
于 2012-10-02T07:00:09.797 回答
1

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

那是因为你只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-02T09:19:23.570 回答