Perl awk或sed CSV文件操作
我想打印第一列和第二列,不需要任何额外字符,我想消除所有(“,和第三列),谢谢Perl awk或sed CSV文件操作,perl,unix,sed,awk,Perl,Unix,Sed,Awk,我想打印第一列和第二列,不需要任何额外字符,我想消除所有(“,和第三列),谢谢 "a004-1b","North","at006754" "a004-1c","south","atytgh0" "a004-1d","east","atrthh" "a010-1a","midwest","atyu" "a010-1b","south","rfg67" 上面的脚本甚至将处理嵌入双引号或逗号的字段。唯一的缺点(如果可以这样称呼的话)是第一个字段从$2开始 概念证明 如果您想要“纯”awk或sed,这
"a004-1b","North","at006754"
"a004-1c","south","atytgh0"
"a004-1d","east","atrthh"
"a010-1a","midwest","atyu"
"a010-1b","south","rfg67"
上面的脚本甚至将处理嵌入双引号或逗号的字段。唯一的缺点(如果可以这样称呼的话)是第一个字段从$2开始
概念证明
如果您想要“纯”awk或sed,这将不符合要求,但除此之外,它还可以工作:
$ awk -F'^"|","|"$' '{print $2,$3}' ./infile.csv
a004-1b North
a004-1c south
a010-1a midwest
a010-1b south
如果您正在为此使用awk
,为什么要在其上加一个Perl标记
在Perl中:
awk -F, '{print $1 " " $2}' | tr -d '"'
您需要GNU Awk 4才能工作:
awk -F'\"|\,' '{print $2,$5}' sample
我喜欢这个新的“场模式”功能。这是我的新锤子,一切都是钉子。请在网站上阅读
(以这种方式编写,它不考虑嵌入的逗号或引号,因为问题表明这是不需要的。)不处理嵌入的双引号:
$ gawk -vFPAT='[^",]+' '{print $1,$2}'
要处理这些问题:
sed -e 's/^"\([^"]*\)","\([^"]*\)".*/\1 \2/'
上述方法甚至适用于1或2字段输入。虽然它不处理嵌入的引号或逗号,但后者在我的经验中并不太常见(不幸)。是的,不管有多复杂,切换到Python或其他内置CSV支持的东西都是有意义的。cut-d“,“-f1,2——输出分隔符=“”|tr-d'“
也会这样做,所以这里不需要awk。@jfgagne,非常正确,但OP指定了awk或sed。就我个人而言,我更喜欢剪。在我的辩护中,我几乎不再使用awk或sed:^\n我必须承认我的大部分awk
和sed
用法就在这里,所以=)你不需要省略引号或逗号,awk-F'“|,”
就足够了。但与其他一些答案一样,这不适用于带有嵌入引号或逗号的字段。相反,请使用awk-F'^“|”、“|”$
,它会处理所有的角盒。
$ gawk -vFPAT='[^",]+' '{print $1,$2}'
sed -e 's/^"\([^"]*\)","\([^"]*\)".*/\1 \2/'
sed -n -e 's/^"//;s/"$//;s/","/ /;s/","/\n/;P'