簡體   English   中英

bash腳本,修改文件

[英]bash script, modifying a file

這是我的腳本:

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

不幸的是,它只對列表中的最后一個文件起作用。 它跳過所有其他。 我感覺這與緩沖或globbing或其他有關。 我想念什么?

您已在循環內部定義了file_read ,然后從外部對其進行了調用。

應該是相反的方式!

您可能需要將某些值作為參數傳遞給file_read

不需要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

不幸的是,它只對列表中的最后一個文件起作用。

這是因為循環后您只調用一次file_read 它僅對最后一個文件執行,因為變量iTHE_FILE2從循環的最后一次迭代中保留下來。

這是一個awk解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM