[英]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
。 它僅對最后一個文件執行,因為變量i
和THE_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.