Unix awk字段分隔符,当分隔符显示在双引号中时
我试图使用awk读取字段位置3$3处的一些输入,字段3是一个字符串Unix awk字段分隔符,当分隔符显示在双引号中时,unix,awk,field,delimiter,Unix,Awk,Field,Delimiter,我试图使用awk读取字段位置3$3处的一些输入,字段3是一个字符串 awk -F'","' '{print $1}' input.txt 我的文件input.txt如下所示 field1,field2,field3,field4,field5 问题是这些字段用逗号分隔,其中一些字段是双引号,而另一些字段不是。字段5是双引号,包含各种类型的符号。例如: imfield1,imfield2,"imfield3",imfield4,"im"",""fi"",el,""d5" awk能处理这样的
awk -F'","' '{print $1}' input.txt
我的文件input.txt如下所示
field1,field2,field3,field4,field5
问题是这些字段用逗号分隔,其中一些字段是双引号,而另一些字段不是。字段5是双引号,包含各种类型的符号。例如:
imfield1,imfield2,"imfield3",imfield4,"im"",""fi"",el,""d5"
awk能处理这样的情况吗??
更详细地说,如何通过键入$5获得整个字符串?分隔符是一个简单的逗号,而不是引号之间的逗号。如果字段不包含逗号,则awk可能会启动该任务:
awk -F , '
{
if ($3 ~ /^".*"$/) {
$3 = substr($3, 2, length($3)-2);
gsub(/""/, "", $3);
}
print $3;
}' input.txt
这已经变得相当复杂了。如果字段中可能有逗号,请使用适当的CSV解析器,例如在Perl或Python中。请参见您可以使用的,在这种情况下,它非常简单:
function parse_csv(..) {
..
}
{
num_fields = parse_csv($0, csv, ",", "\"", "\"", "\\n", 1);
print csv[2]
}
如果您不热衷于Awk,Python还提供了一个很好的CSV解析器:
import csv, sys
for row in csv.reader(sys.stdin):
print row[2]
或者从命令行(一行中有点棘手):
python-c'导入csv,sys;[sys.stdout.write(行[2]+“\n”)用于csv.reader(sys.stdin)中的行]
您可以在awk
设置空字段分隔符中解析该行。当inda==0时,您可以将$i
分配给var并打印出来,而不是printf(“%s”,$i)
#echo "\"AAA,BBB\",\"CCC\",\"DDD, EEE, FFF\"" > uno
awk 'BEGIN { FS="" }
{
for ( i=1; i<NF; i++) {
if ( $i == "\"" )
if ( inda == 0 )
inda = 1
else
inda = 0
if ( $i == "," )
if ( inda == 0 )
$i="|"
printf("%s",$i)
}
printf("\n")
}' uno
\echo“\“AAA,BBB\”,“CCC\”,“DDD,EEE,FFF\”>uno
awk'开始{FS=”“}
{
对于(i=1;问题中的第二个示例在最后一个字段中有逗号。实际内容(已处理引号)为:im”、“fi”、el、“d5
#echo "\"AAA,BBB\",\"CCC\",\"DDD, EEE, FFF\"" > uno
awk 'BEGIN { FS="" }
{
for ( i=1; i<NF; i++) {
if ( $i == "\"" )
if ( inda == 0 )
inda = 1
else
inda = 0
if ( $i == "," )
if ( inda == 0 )
$i="|"
printf("%s",$i)
}
printf("\n")
}' uno