tsvファイルから二重引用符で囲まれた列内の改行を削除する方法は?

tsvファイルから二重引用符で囲まれた列内の改行を削除する方法は?

行に「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ファイルに出力してからファイル名を変更します)。最初の列がまだ存在しない場合にのみ実行されますcatnewfile

与えられた入力データに対して列が正しくタブ区切りであると仮定すると、次のタブ区切りファイルが生成されます。

"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"

おすすめ記事