BASHの最後の行のCSV列から空の文字列を読み込みます。

BASHの最後の行のCSV列から空の文字列を読み込みます。

gawkcsvファイルfile.csvの最初の列から値を読み取るには、次のスクリプトを使用しています。含まれているカンマを無視したくないので
使用します。gawk

col=`gawk ' 
BEGIN {
FPAT="([^,]*)|(\"[^\"]*\")+"
}
{print $1 }' file.csv`

しかし、空の文字列/スペースが最後の行にある場合、このメソッドはそれを無視することがわかりました。

たとえば、file.csvが次のような場合:

col1,col2
"a,a","a,a1" 
"b","b1" 
,"c1"  

結果は次のとおりです。

col1
a,a
b 

変える

col1
a,a
b 

この問題を解決するにはどうすればよいですか?

ありがとうございます!

関連投稿:BASHのCSVファイルから空の文字列を読み取る

答え1

以下のコメントでも述べたように前の質問、これはCSVまたはawkスクリプトには関係なく、コマンド出力を保存する方法に関連しています。

$ printf 'a\nb\n\n'
a
b

$ col=$(printf 'a\nb\n\n')
$ printf '%s' "$col"
a
b$

$ col=$(printf 'a\nb\n\n'; printf x)
$ printf '%s' "$col"
a
b

x$
$ col="${col%x}"
$ printf '%s' "$col"
a
b

$

上記のようにすれば得ることができます。みんなコマンド置換が削除される最後の改行文字を含む変数に格納されたコマンドの出力。最後の改行文字も削除するには:

$ col="${col%$'\n'}"
$ echo "$col"
a
b

$ printf '%s' "$col"
a
b
$

x\n単一ステップを実行するのではなく、2つのステップで合計を削除する理由は、コマンドが出力を生成しない場合、または出力がaで終わらないと、次の項目には存在しないため、col="$(col%$'\n'x}"操作が失敗するため\nです。\nxcol

正しい:

$ col=$(printf 'a'; printf x)
$ col="${col%x}"
$ col="${col%$'\n'}"
$ printf '%s' "$col"
a$

無効:

$ col=$(printf 'a'; printf x)
$ col="${col%$'\n'x}"
$ printf '%s' "$col"
ax$

この問題の詳細については、以下の「コマンドの置き換え」をご覧ください。

  1. POSIX規格シェル実行環境部分それは言う:

シェルはサブシェル環境(シェル実行環境を参照)でコマンドを実行し、コマンド置換(コマンドテキスト+ "$()"またはバックティック)をコマンドの標準出力に置き換えてコマンド置換を拡張する必要があります。複数文字のシーケンスです。

  1. https://mywiki.wooledge.org/CommandSubstitution問題についてさらに詳しく説明し、上記で使用した解決策を提供します。

関連情報