これは、一般的な CSV 解析の問題の特定のケースです。一般的な解決策は Lorance Stinson (google Stinson awk CSV parser
) によって提供されていますが、この特定の問題に対処する最も簡単な方法は、二重引用符内の改行を他の文字に変換し、レコードごとに 1 行の形式でファイルを処理することです。 、次に元に戻します。例:
$ cat file
"Test_data1" "Test_data2" "1s" "452" "Test
data643" "
" "4d" "System" "Institute"
"Test_data3" "Test_data4" "2s" "563" "Test
data754" "
" "5d" "Non System" "Association"
単一行に変換するには:
$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file
"Test_data1" "Test_data2" "1s" "452" "Test♥data643" "♥" "4d" "System" "Institute"
"Test_data3" "Test_data4" "2s" "563" "Test♥data754" "♥" "5d" "Non System" "Association"
そして元に戻すのは簡単tr
です:
$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file | tr '♥' '
\n'
"Test_data1" "Test_data2" "1s" "452" "Test
data643" "
" "4d" "System" "Institute"
"Test_data3" "Test_data4" "2s" "563" "Test
data754" "
" "5d" "Non System" "Association"
上記では、引用符内の改行の代わりに control-C を使用し、好きな文字を選択します (改行に変換するために tr ではなく awk または sed を使用する場合は文字列)。
awk と tr の間に元のファイルに対して必要なことを行うコマンドを挿入するだけです。たとえば、逆方向に並べ替えます。
$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file | sort -r | tr '♥' '\n'
"Test_data3" "Test_data4" "2s" "563" "Test
data754" "
" "5d" "Non System" "Association"
"Test_data1" "Test_data2" "1s" "452" "Test
data643" "
" "4d" "System" "Institute"