Linux/Unix bash基本脚本awk/sed

Linux/Unix bash基本脚本awk/sed,linux,csv,sed,awk,Linux,Csv,Sed,Awk,我正在编写bash脚本 var=$(ls -t1 | head -n1); cat $var | sed 's/"//g' > latest.csv cat latest.csv | sed -e 's/^\|$/"/g' -e 's/,/","/g' > from_epos.csv echo "LATEST: $var"; 这是整个脚本,它意味着从当前文件中删除所有引号,并在每个字段之间添加新的引号 输入: "sku","item","price","qty" 5135,"ITE

我正在编写bash脚本

var=$(ls -t1 | head -n1);
cat $var | sed 's/"//g' > latest.csv
cat latest.csv | sed -e 's/^\|$/"/g' -e 's/,/","/g' > from_epos.csv
echo "LATEST: $var";
这是整个脚本,它意味着从当前文件中删除所有引号,并在每个字段之间添加新的引号

输入:

"sku","item","price","qty"
5135,"ITEM1",1.79,5
5338,"ITEM2",1.39,5
5318,"ITEM3",1.09,5
5235,"ITEM4",1.09,5
9706,"ITEM5",1.99,5
输出:

"sku","item","price","qty"
"5135","ITEM1","1.79","5
"
"5338","ITEM2","1.39","5
"
"5318","ITEM3","1.09","5
"
"5235","ITEM4","1.09","5
"
"9706","ITEM5","1.09","5
"
我的理想输出是:

"sku","item","price","qty"
"5135","ITEM1","1.79","5"
"5338","ITEM2","1.39","5"
"5318","ITEM3","1.09","5"
"5235","ITEM4","1.09","5"
"9706","ITEM5","1.99","5"
它似乎是在电流输出的行之间输入随机字符,如 引号在CR和LF之间

问题是什么?如何实现我的理想愿景

谢谢


Adam

awk可以在一个命令中完成所有这一切:

awk -F"," 'NR>1{for(i=1; i<=NF; i++) {if (!($i ~ /^"/)) printf("\"%s\"",$i); 
           else printf("%s",$i); if (i<NF) printf(","); else print "";}}' latest.csv

awk-F“[,\r]”NR==1{print}NR>1{for(i=1;i使用sed的解决方案:

sed -e 's/"//g; s/,/","/g; s/^/"/; s/$/"/'
长管道注释版本:

sed -e 's/"//g' | # removes all quotations
sed -e 's/,/","/g' | # changes all colons to ","
sed -e 's/^/"/; s/$/"/' # puts quotations in the start and end of each line

和上面一样的输出,可能编码有问题?输入结果是:text/plain;charset=us-ascii@AdamLesniak看起来您的文件是在windows上创建的。如果您没有
dos2unix
实用程序,请运行此
sed-i“s/\r$//g“input.csv
已安装dos2unix,当我安装dos2unix input.csv时无法工作,输出仍然相同;/同sed@AdamLesniak从技术上讲,最好的答案应该是他。他是解决你问题的人。:@JS웃: 谢谢,非常感谢。您的awk命令比我最初的awk解决方案简洁得多。+1您的方法似乎是错误的。如果您需要处理CSV,请使用真正的编程语言和正确的语法。我已尝试根据提供的输入运行脚本,但它确实提供了正确的输出。编码可能是一个问题。可能重复同样的问题,在行尾之间随机输入您能给我看一下head-n2 latest.csv | od-c
command0000000 s k u,i t e m,p r i c e,q 00000 20 t y\r\n 1 2 3 4 5 6 7 8 9 0 8 00000 40 5的输出吗7 9,-2 4\r\n 0000070有什么方法删除这些\r\n?
awk -F"[,\r]" 'NR==1{print} NR>1{for(i=1; i<NF; i++) {if (!($i ~ /^"/)) 
               printf("\"%s\"",$i); else printf("%s",$i); if (i<NF-1) printf(",");
               else print "";}}'
sed -e 's/"//g; s/,/","/g; s/^/"/; s/$/"/'
sed -e 's/"//g' | # removes all quotations
sed -e 's/,/","/g' | # changes all colons to ","
sed -e 's/^/"/; s/$/"/' # puts quotations in the start and end of each line