行に「THIS CONTAIN NEWLINE」が必要です(列2と4から改行を削除する必要があります)。
"column1" "column2" "column3" "column4" " column5"
"DATA" "THIS "DATA" "THIS "DATA"
CONTAIN NEWLINE" CONTAIN NEWLINE"
予想出力:
"column1" "column2" "column3" "column4" " column5"
"DATA" "THIS CONTAIN NEWLINE" "DATA" "THIS CONTAIN NEWLINE" "DATA"
ベストアンサー1
このテキスト処理の問題を困難または異常にする理由は、列を個別に処理する必要があるためです。
これはちょっとしたハッキングですが、作業が完了したようです。
#!/bin/sh
rm -f newfile
for column in 1 2 3 4 5; do
cut -f "$column" file |
perl -ne 'chomp;$nl = ((tr /"/"/ % 2 == 0) ? "\n" : " "); print $_, $nl' |
sed -e 's/[[:blank:]]*$//' -e '/^[[:blank:]]*$/d' |
{ if [ -f newfile ]; then
paste newfile -
else
cat
fi
} >newfile.tmp
mv newfile.tmp newfile
done
スクリプトは、入力ファイルが呼び出され、file
呼び出されたファイルを生成すると仮定します(そして一時データnewfile
のファイル名を使用します)。newfile.tmp
また、列が適切にタブで区切られていると仮定します。
ソースファイルからタブ区切りの列を1つずつ抽出する方法を使用しますcut
。各個々の列は短いPerlスクリプトを介して渡されます。
chomp;
$nl = ( ( tr /"/"/ % 2 == 0 ) ? "\n" : " " );
print $_, $nl;
これは各行の二重引用符の数を数え、行に偶数の二重引用符が含まれている場合は、改行を追加して行を出力します。引用符の数が奇数の場合、行の末尾にスペース文字が追加されます(したがって、複数行にわたって引用符付き文字列がマージされます)。これは非常にハッキーな方法です。
いくつかのクリーンアップ操作を実行し、行の末尾sed
から末尾のスペースを削除し、空の行を削除します。
次に、paste
この新しいデータをタブ区切りの新しい列に作成しましたnewfile
(最初にnewfile.tmp
ファイルに出力してからファイル名を変更します)。最初の列がまだ存在しない場合にのみ実行されますcat
。newfile
与えられた入力データに対して列が正しくタブ区切りであると仮定すると、次のタブ区切りファイルが生成されます。
"column1" "column2" "column3" "column4" " column5"
"DATA" "THIS CONTAIN NEWLINE" "DATA" "THIS CONTAIN NEWLINE" "DATA"
タブをパイプ記号に置き換えます(列の開始位置と終了位置を表示するため)。
$ tr '\t' '|' <newfile
"column1"|"column2"|"column3"|"column4"|" column5"
"DATA"|"THIS CONTAIN NEWLINE"|"DATA"|"THIS CONTAIN NEWLINE"|"DATA"