ソースシステムには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 オプションは値を標準出力にパイプします。@F
slice
$_
$"
superglobal
-p
$_
sed
まず、すべてのモードを切り替えてから" "
--->"\n"
ループに入り、\n
2つのモードが残るまで後退します。この時点で、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"}'