输入文件:
"1","2col",""3col " "
"2","2col"," "3c,ol " "
"3","2col"," 3co,l"
"4","2col","3co,l"
"5","2col",""3co,l "" "
"6","2col",""3c,ol ""3c,ol"""
输出文件:
"1","2col","3col "
"2","2col"," 3c,ol "
"3","2col"," 3co,l"
"4","2col","3co,l"
"5","2col","3co,l "
"6","2col","3c,ol 3c,ol"
请帮我用Unix命令获取上面的输出。请注意输出中的第3列已修改,所有内部双引号均已删除。
逗号是终结者。当双引号之间存在逗号时,它不被视为终止符。看到第6行和第2个逗号之后,逗号作为双引号之间的文本存在,这很好。
到目前为止我尝试过的:
sed 's/""|/|/g'
sed -e "s/\"\"//g"
perl -pe 's/(?<!^)(?<!\,)"(?!\,)(?!$)/""/g'
假设(第一列和第二列是“干净的”,例如它们不包含,
)
输入:
"1","2col",""3col " "
"2","2col"," "3c,ol " "
"3","2col"," 3co,l"
"4","2col","3co,l"
"5","2col",""3co,l "" "
"6","2col",""3c,ol ""3c,ol"""
命令:
tr -d '"' < input | awk -F',' -v OFS=',' '{$1="\""$1"\"";$2="\""$2"\"";printf $1 OFS $2 OFS "\"";for(u=3;u<=NF;u++){if(u!=NF)printf $u OFS;else printf $u};printf "\"" RS}'
输出:
"1","2col","3col "
"2","2col"," 3c,ol "
"3","2col"," 3co,l "
"4","2col","3co,l"
"5","2col","3co,l "
"6","2col","3c,ol 3c,ol"
说明:
tr -d '"' < input
将删除所有"
| awk
输出到awk
-F',' -v OFS=','
输入/输出字段分隔符定义为逗号"
用$1="\""$1"\"";$2="\""$2"\"";
围绕前两列你打印它们printf $1 OFS $2 OFS "\"";
for(u=3;u<=NF;u++){if(u!=NF)printf $u OFS;else printf $u};printf "\"" RS}
对于列的其余部分,您只需将它们重新附加在一起,然后在行尾添加最后一个"
。为了便于阅读:
'{
$1="\""$1"\""
$2="\""$2"\""
printf $1 OFS $2 OFS "\""
for(u=3;u<=NF;u++)
{
if(u!=NF)printf $u OFS
else printf $u
}
printf "\"" RS
}'
使用引号查找前两个字段并连接其他字段。
awk -F '"' '
BEGIN {q="\""}
{printf "%s", q$2q$3q$4q$5q; for (i=6;i<=NF;i++) printf "%s", $i; print q}
' inputfile
编辑:另一种选择
paste -d, <( cut -d"," -f1,2 < inputfile) \
<( cut -d"," -f3- < inputfile | sed 's/"//g;s/.*/"&"/')
编辑:另一种选择
sed 's/old/new/g
:将替换应用于regexp sed
s / old / new / number`的所有匹配:仅替换正则表达式的numberth匹配。当您在GNU sed中混合g和数字修饰符时,将忽略第一个匹配项,然后匹配并替换所有匹配项。
在这种情况下:
sed -r 's/"//g6;s/$/"/' inputfile