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
は、1行のフィールド数を含む変数です。 AWKでは、0または空の文字列""
でない場合はtrueです。したがって、2番目の部分(NF
がデクリメントされる)は、NF
が0でない場合にのみ発生します。
2番目の部分(NF-=1
NF--
または--NF
)は、NF
変数から1を減算するだけです。これにより、最後のフィールドが印刷されなくなります。これは、フィールドを変更すると(この場合は最後のフィールドが削除されます)、awk
re-construct $0
がデフォルトでスペースで区切られたすべてのフィールドを連結するためです。 $0
には最後のフィールドが含まれなくなりました。
最後の部分は1
です。それは不思議ではなく、true
を意味する式として使用されているだけです。 awk
式が関連付けられたアクションなしでtrueに評価される場合、awk
デフォルトアクションはprint $0
です。
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
Perlの使用:
Perl -lane '$,=" ";pop(@F);print(@F)' in
rev
+ cut
の使用:
rev in | cut -d ' ' -f 2- | rev
GNU sedを使用:
sed -r 's/\s+\S+$//' input.txt
より一般的には、これはOSXのBSD sedと同様に機能し、GNU sed:
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}$//' input.txt
移植性の高い次のいずれかを使用できます。
sed 's/[[:space:]]*[^[:space:]]*$//' file
awk '{sub(/[[:space:]]*[^[:space:]]*$/,"")}1' file
区切り文字が常に単一の文字である場合(2つ以上の連続する区切り文字が空のフィールドを指定する場合)、head
入力ファイルの最初の行だけを区切り、区切り文字をカウントできます(n
区切り文字は数値を意味しますフィールドの数はn+1
)であり、次にcut
を使用して1
stフィールドからn
thフィールド(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
を使用します。
同様の問題を抱えているがフィールド区切り記号が異なる人のために、このawk
メソッドはフィールド区切り記号を正しく保持します:
$ cat file
foo.bar.baz
baz.bar.foo
$ awk -F'.' 'sub(FS $NF,x)' file
foo.bar
baz.bar
Vimを使用する:
Vimでファイルを開く
vim <filename>
カーソルが他の場所にある場合に備えて、最初の行に移動します。
gg
"q" qq
という名前のマクロを作成します。これは、現在の行の後ろ$
に移動し、最後のスペースF
に戻ります(大文字のF、その後にリテラルスペースが続きます) )次に、現在の位置から行の終わりまで削除しますD
次の行j
に移動し、q
でマクロの記録を停止します。
qq$F Djq
これで、各行に@q
を使用してマクロを繰り返すことができます。@@
を押して、最後のマクロを繰り返すか、さらに簡単にすることもできます。
99@q
マクロを99回繰り返す。
注:番号は行と正確に一致してはなりません。