Linux/Unix bash基本脚本awk/sed
我正在编写bash脚本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
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之间
问题是什么?如何实现我的理想愿景
谢谢
Adamawk可以在一个命令中完成所有这一切:
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