web-dev-qa-db-ja.com

Linuxでファイルの最後の列を削除する方法

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
25
zara

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は、1行のフィールド数を含む変数です。 AWKでは、0または空の文字列""でない場合はtrueです。したがって、2番目の部分(NFがデクリメントされる)は、NFが0でない場合にのみ発生します。

2番目の部分(NF-=1NF--または--NF)は、NF変数から1を減算するだけです。これにより、最後のフィールドが印刷されなくなります。これは、フィールドを変更すると(この場合は最後のフィールドが削除されます)、awk re-construct $0がデフォルトでスペースで区切られたすべてのフィールドを連結するためです。 $0には最後のフィールドが含まれなくなりました。

最後の部分は1です。それは不思議ではなく、trueを意味する式として使用されているだけです。 awk式が関連付けられたアクションなしでtrueに評価される場合、awkデフォルトアクションはprint $0です。

43
cuonglm

PCREでのgrepの使用:

$ 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
16
heemayl

Perlの使用:

Perl -lane '$,=" ";pop(@F);print(@F)' in

rev + cutの使用:

rev in | cut -d ' ' -f 2- | rev
14
kos

GNU sedを使用:

sed -r 's/\s+\S+$//' input.txt

より一般的には、これはOSXのBSD sedと同様に機能し、GNU sed:

sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}$//' input.txt
5
Digital Trauma

移植性の高い次のいずれかを使用できます。

sed 's/[[:space:]]*[^[:space:]]*$//' file

awk '{sub(/[[:space:]]*[^[:space:]]*$/,"")}1' file
1
Ed Morton

区切り文字が常に単一の文字である場合(2つ以上の連続する区切り文字が空のフィールドを指定する場合)、head入力ファイルの最初の行だけを区切り、区切り文字をカウントできます(n区切り文字は数値を意味しますフィールドの数はn+1)であり、次にcutを使用して1stフィールドからnthフィールド(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を使用します。

1
don_crissti

同様の問題を抱えているがフィールド区切り記号が異なる人のために、このawkメソッドはフィールド区切り記号を正しく保持します:

$ cat file 
foo.bar.baz
baz.bar.foo
$ awk -F'.' 'sub(FS $NF,x)' file
foo.bar
baz.bar
0
htaccess

Vimを使用する:

Vimでファイルを開く

vim <filename> 

カーソルが他の場所にある場合に備えて、最初の行に移動します。

gg

"q" qqという名前のマクロを作成します。これは、現在の行の後ろ$に移動し、最後のスペースFに戻ります(大文字のF、その後にリテラルスペースが続きます) )次に、現在の位置から行の終わりまで削除しますD次の行jに移動し、qでマクロの記録を停止します。

qq$F Djq

これで、各行に@qを使用してマクロを繰り返すことができます。
@@を押して、最後のマクロを繰り返すか、さらに簡単にすることもできます。

99@q

マクロを99回繰り返す。
注:番号は行と正確に一致してはなりません。

0
cee