这可能是一个愚蠢的问题,但我是初学者。当前从 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
您的问题似乎与\"
您正在使用的有关。
一旦你开始一个带引号的字符串,
"
它就会转到下一个(不带引号的)"
。插入\"
到带引号的字符串中不会终止该带引号的字符串,而是“按原样”插入,即:双引号字符。在带引号的字符串内,
$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