特定のフィールドを抽出する必要があるCSVがあります。 csvはパイプで区切られ、(|
)二重引用符("
)は、一部のテキストでテキストフィールドと改行を保護するために使用されます(問題です)。
例えば。
"aaa"|"111"|"!!!"|""
"bbb"|"222"|"@@
@"|""
"ccc"|"333"|"###"|""
各レコードの2番目のフィールドを抽出したいと思います。
111
222
333
bashスクリプトを使用してファイルを読み込んでいますが、改行文字が指定されていてもread
改行文字に達するとコマンドが停止するようです。-d
これは、上記の例では、私のスクリプトはレコード1(私が使用するread -d \| varname
)を正しく処理しますが、改行文字を3番目のフィールドの一部として認識しないため、レコード2を正しく処理できないことを意味します。これで@"|""
新しい記録とみなされたので、すべての地獄が解放されました。
この目的でこれを使用できますかread
?それとも代替策を検討する必要がありますか?
私が書いた空read
使用する設定を試して、ウェブを検索してみてください。興味深いことに、私と同じ入力ファイルに問題がある人に会いましたが、問題はExcelにありました。
ベストアンサー1
read
CSVを処理できるコマンドを組み込んだシェルでは、代わりにksh93
次のものを使用できますbash
。
$ while IFS='|' read -rS a b c; do printf '%s\n' "$b"; done < file
111
222
333
形式を処理できる形式に変換するには、bash
次のread
手順を実行します。
< file ksh93 -c 'while IFS="|" read -rSA a; do
printf "%s|" "${a[@]//[\|]/\\\0}"
printf "\0"
done' |
bash -c 'while IFS="|" read -d "" a b c; do
printf "%s\n" "$b"
done'