大容量ファイルの各行から最後の2つの「区切り文字列」を削除する方法

大容量ファイルの各行から最後の2つの「区切り文字列」を削除する方法

ソースシステムには2GBのスペースで区切られたファイルがたくさんあります。各ファイルの各行には、テキスト修飾子として「で囲まれた同じ数の文字列が含まれています。

すべてのファイルのすべての行から最後の2つの文字列とそのテキスト修飾子を削除する必要があります。 (列形式レポートから最後の2つの列を削除するのと同じです)。小さなファイルの場合は、Excelにインポートして列を区切って削除し、タブで区切って保存できます(スペースよりはるかに便利です)。

それにもかかわらず、これらのファイルは大きすぎるため、Excelで処理するには行が多すぎます。だからsed? ?

"text1" "text2" "text3" "text4" "text5" "text6"

各行には同じ数の文字列があります。各行から「text5」「text6」を削除する方法は?

答え1

常に最後の2つの列を削除したい場合は、次のイディオムを使用できます。

awk 'NF-=2' file

私はこれがうまくいかないことを知りましたnawk。なぜそうなのかわかりません。移植可能な方法は `$1=$1: を使ってフィールド分割を強制することです。

awk '{NF-=2} $1=$1' file

出力:

"text1" "text2" "text3" "text4"

答え2

このsedコマンドは、ファイルの各行の末尾にスペースで区切られた引用符で囲まれた最後の2つの文字列を削除し、infile結果を次に送信しますoutfile

sed 's/ *"[^"]*" *"[^"]*" *$//' < infile > outfile

答え3

awk '{$(NF-1)=$NF=""}1'  inp

perl -pale '$_ = "@F[0..@F-3]"' inp

sed -ne '
   s/" "/"\
"/g
   :a
   s/\n/ /
   /\n.*\n.*\n/ba
   P
' inp

説明する:

  • awkコードは最後のフィールドと最後の2番目のフィールドを消去して印刷します。
  • Inフィールドは配列perlに格納され、0番目から3番目、最後までのフィールドが選択され、現在の行に保存されます。二重引用符は、配列→文字列変換を実装するために使用され、デフォルト値はスペースで一緒に連結されます。その後、Perl オプションは値を標準出力にパイプします。@Fslice$_$" superglobal-p$_
  • sedまず、すべてのモードを切り替えてから" "--->"\n"ループに入り、\n2つのモードが残るまで後退します。この時点で、P大文字の p, コマンドを使用してパターン空間の最初の部分を印刷します。

答え4

最後の2..AWKまで各フィールドを印刷します。 AWKは、連続したフィールド数を提供する変数NFを使用します。

echo "text1" "text2" "text3" "text4" "text5" "text6" | awk  -v ORS=""  '{
for(i=1;i<=NF-2;i++)print $i, " " ; print "\n"}'

関連情報