awk 当一个字段同时使用分隔符和引号时

use*_*013 8 awk csv

我有以下格式的文件:

field1|field2|field3
field1|"field2|field2"|field3
Run Code Online (Sandbox Code Playgroud)

注意第二行包含双引号。双引号内的字符串属于字段 2。如何使用 awk 提取它?我一直在谷歌搜索没有结果。我也尝试过,但没有运气

FS='"| "|^"|"$' '{print $2}'  
Run Code Online (Sandbox Code Playgroud)

iru*_*var 12

如果你有最新版本的gawk你很幸运。有这个FPAT功能,记录在这里

awk 'BEGIN {
 FPAT = "([^|]+)|(\"[^\"]+\")"
}
{
 print "NF = ", NF
 for (i = 1; i <= NF; i++) {
    sub(/"$/, "", $i); sub(/^"/, "", $i);printf("$%d = %s\n", i, $i)
 }
}' file

NF =  3
$1 = field1
$2 = field2
$3 = field3
NF =  3
$1 = field1
$2 = field2|field2
$3 = field3
Run Code Online (Sandbox Code Playgroud)


Tim*_*iam -3

您可能需要格式化这些数据,sed以便更容易地解析它awk。例如:

$ sed 's/"//g' awktest1.txt 
field1|field2|field3
field1|field2|field2|field3

$ sed 's/"//g' awktest1.txt > awktest2.txt

$ awk 'BEGIN {FS = "|"} ; {print $2}' awktest2.txt 
field2
field2
Run Code Online (Sandbox Code Playgroud)

但话又说回来,我不知道您正在使用的数据的性质。

  • 这个想法明确地将“field2|field2”作为第二行中的单个字段。 (3认同)