txtファイルの最後の列を削除したいのですが、列番号がわかりません。どうすればこれができますか?
例:
入力:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
そして、出力を次のようにします。
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
txtファイルの最後の列を削除したいのですが、列番号がわかりません。どうすればこれができますか?
例:
入力:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
そして、出力を次のようにします。
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
回答:
でawk
:
awk 'NF{NF-=1};1' <in >out
または:
awk 'NF{NF--};1' <in >out
または:
awk 'NF{--NF};1' <in >out
これはブードゥー教のように見えますが、機能します。これらのawkコマンドにはそれぞれ3つの部分があります。
最初はでNF
、これは2番目の部分の前提条件です。NF
行内のフィールドの数を含む変数です。AWKでは、0でも空の文字列でもない場合は真です""
。したがって、2番目の部分(NF
減少する部分)NF
は0でない場合にのみ発生します。
2番目の部分(NF-=1
NF--
または--NF
)は、NF
変数から1を減算するだけです。これは、フィールドを変更する場合(この場合は最後のフィールドを削除する)、awk
再構築し$0
、デフォルトでスペースで区切られたすべてのフィールドを連結するため、最後のフィールドが印刷されないようにします。$0
もう最後のフィールドが含まれていません。
最後の部分は1
です。それは魔法ではなく、を意味する表現として使用されているだけtrue
です。場合はawk
それに関連する行為のない真の表現評価し、awk
デフォルトのアクションですprint $0
。
--
。注、現在、;1
POSIX準拠が必要です。
,
あなたの区切り記号と仮定:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
grep
PCREでの使用:
$ grep -Po '.*(?=\s+[^\s]+$)' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
GNUの使用sed
:
$ sed -r 's/(.*)\s+[^\s]+$/\1/' file.txt
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
区切り文字が常に単一の文字である場合(2つ以上の連続する区切り文字が空のフィールドを指定する場合)、head
入力ファイルの最初の行だけを区切り、区切り文字をカウントし(n
区切り文字はフィールドの数を意味しますn+1
)cut
、1
stフィールドからの印刷に使用できますまでn
番目のフィールド(最後の2番目)、例えばタブ区切りの入力を持ちます:
n=$(head -n 1 infile | tr -dc \\t | tr \\t \\n | wc -l)
cut -f1-$n infile > outfile
または、csvファイルの場合:
n=$(head -n 1 infile | tr -dc , | tr , \\n | wc -l)
cut -d, -f1-$n infile > outfile
時間があれば、いくつかのベンチマークを実行しますが、膨大な入力があると、このソリューションは正規表現を使用する他のソリューションよりも速くなるはずです。cut
このジョブ用に最適化されたフィールドを使用します。
vimの使用:
vimでファイルを開く
vim <filename>
カーソルが他の場所に置かれた場合に備えて、最初の行に移動します。
gg
「q」という名前のマクロを作成します qq
は現在の行$
の最後に移動し、最後のスペースF
(大文字のF、リテラルSPACE)に戻り、現在の位置から行末まで削除D
して次の行に移動j
します。でマクロの記録を停止しq
ます。
qq$F Djq
これで@q
、各行に対してマクロを繰り返すことができます。
を押し@@
て最後のマクロを繰り返したり、さらに簡単にすることもできます。
99@q
マクロを99回繰り返します。
注:番号は行と正確に一致してはなりません。