awkはcsvファイルからフィールドを抽出できません。

awkはcsvファイルからフィールドを抽出できません。

愚かな質問かもしれませんが、私は初心者です。現在、csvファイルからフィールドを抽出するのに問題があります。理想的には、liタグと括弧内の3番目の列を使用して印刷したいと思います。私が得た最も近いもの

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

TSVファイル内のタブ区切りの2番目と3番目のフィールドの<li>$2($3)</li>場所$2と場所を印刷したいようです。$3

さまざまな方法でこれを行うことができますが、最も明白な2つの方法は次のとおりです。

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

関連情報