Bash は区切り文字を使用して前の改行文字を読み込みます。

Bash は区切り文字を使用して前の改行文字を読み込みます。

特定のフィールドを抽出する必要がある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

readCSVを処理できるコマンドを組み込んだシェルでは、代わりに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'

答え2

実際には適切なCSVパーサーを使用する必要があります。たとえば、次の付属のRubyを使用します。

ruby -rcsv -e 'CSV.foreach("file", :col_sep => "|") {|row| p row; puts row[1]}'

私達は得た

["aaa", "111", "!!!", ""]
111
["bbb", "222", "@@\n@", ""]
222
["ccc", "333", "###", ""]
333

2行目に改行文字が含まれていることがわかります。p row対応する「デバッグ」行を削除するには、削除してください。

答え3

わかりましたので、私にとって最善の解決策は(しかし好みの問題だと思います)、PHPを使用することですfgetcsv。なぜなら、私はこのサーバーにすでにPHPがインストールされているからです。残念ながら、bashreadコマンドはPHP関数のように改行文字を処理しません。追加の区切り記号(例: "")を自動的に認識します。

サンプル:

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 10000, "|")) !== FALSE) {
        $num = count($data);
        echo "$num fields in line $row:\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $c + 1 . ": " . $data[$c] . "\n";
        }
    }
    fclose($handle);
}
?>

出力(私の元の質問に似ています):

4 fields in line 1:
1: aaa
2: 111
3: !!!
4: 
4 fields in line 2:
1: bbb
2: 222
3: @@
@
4: 
4 fields in line 3:
1: ccc
2: 333
3: ###
4: 

関連情報