我正在尝试使用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处理这样的情况吗? 更多的是,我如何通过典型的5美元获得整个字符串?
答案 0 :(得分:3)
您可以使用Lorance Stinson's Awk CSV parser,在这种情况下,它就像:
一样简单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 'import csv,sys;[sys.stdout.write(row[2]+"\n") for row in csv.reader(sys.stdin)]' < input.txt
答案 1 :(得分:0)
分隔符是一个简单的逗号,而不是引号之间的逗号。如果字段不包含逗号,那么awk可能正在执行任务:
awk -F , '
{
if ($3 ~ /^".*"$/) {
$3 = substr($3, 2, length($3)-2);
gsub(/""/, "", $3);
}
print $3;
}' input.txt
这已经变得非常复杂了。如果字段内可以有逗号,请使用适当的CSV解析器,例如在Perl或Python中。见https://unix.stackexchange.com/questions/7425/is-there-a-robust-command-line-tool-for-processing-csv-files
答案 2 :(得分:0)
您可以解析awk
设置空字段分隔符中的行。您可以printf("%s",$i)
向$i
分配inda==0
而不是#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
{{1}}