awk 无法从 csv 文件中提取字段

awk 无法从 csv 文件中提取字段

这可能是一个愚蠢的问题,但我是初学者。当前从 csv 文件中提取字段时遇到问题。理想情况下,我想用 li 标签打印它,并在括号中打印第三列。我得到的最接近的是使用

awk -F'\t' '{print "\"<li>$2($3)</li>\""}' OFS='","' datafile.csv

这只会导致"<li>$2($3)</li>"重复而不提取数据。

仅使用awk -F'\t' '{print "\<li>$2,($3)</li>\"}' OFS='","' datafile.csv会导致非终止字符串错误。

如果我使用:

awk '{print $1","$2","$4}' datafile.csv

它用逗号而不是空格打印几乎所有内容

如果我使用:

awk '{print $2","$3"}' datafile.csv

我得到:

awk: non-terminated string ,}... at source line 1
 context is
    {print >>>  $2","$3"} 

我不确定问题是什么。我也尝试过使用cut但没有成功。

答案1

您似乎想要打印<li>$2($3)</li>,其中$2$3是 TSV 文件中的第二个和第三个制表符分隔字段。

您可以通过多种不同的方式来做到这一点,但最明显的两种方式是

print "<li>" $2 "(" $3 ")</li>"

或者

printf "<li>%s(%s)</li>\n", $2, $3

请注意,这两种变体都不包含引号$2$3,因为这样做会输出文字字符串$2$3而不是它们所引用的内容。这是您的第一段代码中的问题awk。其他的则遭受报价不平衡的困扰。

如果您想在字符串两边加上双引号,请使用

print "\"<li>" $2 "(" $3 ")</li>\""

或者

printf "\"<li>%s(%s)</li>\"\n", $2, $3

答案2

正如您所发现的,awk 不会替换$i双引号字符串内部的构造。

echo foo bar baz | awk '{print "$1:$2"}'
$1:$2

awk 通过简单地并排放置字符串来进行字符串连接。

echo foo bar baz | awk '{print $1 ":" $2}'
foo:bar

我看到您设置OFS但没有利用它:打印时,将使用逗号分隔的字符串列表来连接OFS

echo foo bar baz | awk -v OFS=":" '{print $1, $2}'
foo:bar

答案3

您的问题似乎与\"您正在使用的有关。

  1. 一旦你开始一个带引号的字符串,"它就会转到下一个(不带引号的)"。插入\"到带引号的字符串中不会终止该带引号的字符串,而是“按原样”插入,即:双引号字符。

  2. 在带引号的字符串内,$n值不会扩展。

$ echo "one two three" | awk '{print "$2,$3"}'
$2,$3

$ echo "one two three" | awk '{print "\"$2,$3\""}'
"$2,$3"

$ echo "one two three" | awk '{print "\"",$2,$3,"\""}'   # concatenated quotes
" two three "

$ echo "one two three" | awk '{print "\"" $2 $3 "\""}'   # only one string
"twothree"

$ echo "one two three" | awk '{print "\""$2,$3"\""}'     # two strings
"two three"

$ echo "one two three" | awk '{print "\""$2"\"","\""$3"\""}'  # Using OFS
"two" "three"

$ echo "one two three" | awk -vOFS="," '{print "\""$2"\"","\""$3"\""}' # Changing OFS
"two","three"

\"这些是awk 中字符串的一些可能用途。

所以,你可能想要这个:

awk -F'\t' '{print "\"<li>" $2 "(" $3 ")</li>\""}' OFS='","' datafile.csv

相关内容