ファイル内の行の最後の n 文字を削除します。

ファイル内の行の最後の n 文字を削除します。

私は Mac ターミナル (bash) を使用しており、次のような行をdata_list.txt含む というファイルがあります。n

aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

各行の最後の 8 文字を削除するにはどうすればよいですか?

期待される出力data_list.txt:

aaabbbccc_ 
nnhhaa_ 
ayquabay_ 
ayqynbnbn_ 
ooppaa_

ご協力ありがとうございます

答え1

最後の 8 文字を削除する場合、または 8 文字未満の場合はすべてを削除する場合は、次のようにします。

sed "s/.\{0,8\}$//; /^$/d" data_list.txt

拡張正規表現は必要ありません。これにより、可能な限り多くの文字がクリアされますが、8 文字を超えることはありません。空の行が残る場合は、出力から削除されます。

末尾の空白をクリアする必要がある場合(8 文字に含めずに)、次のようにします。

sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt

最後に何を削除する必要があるかの実際の条件は推測することしかできませんが (たとえば、アンダースコアの後のすべての内容、または数字 + 拡張子)、ファイル拡張子とその前の数字を削除する場合は次のようになります。

sed "s/[[:digit:]]*\..*$//" data_list.txt

アンダースコアの後のすべてを削除する方法は、すでに他の回答で示されているため、ここでは繰り返しません。

答え2

正確な入力(最後の行を除くすべての行の末尾に空白がある)には、これを使用できます(「_ の後の部分」を削除したいと想定します)。

sed 's/........ *$//' data_list.txt

最後の「下線」文字の後のすべてを削除するには、これを使用します。

sed 's/\(.*_\).*$/\1/' data_list.txt

sed は貪欲なので、複数の下線文字がある行でも機能します。これが MacOS で機能するかどうかはわかりませんが、少なくとも、Google 検索エンジンがここにたどり着く機能を持つ Linux sed ユーザーにとっては便利です...

答え3

100,000 行のサンプル ファイルを使用した、awkfrippe のアプローチと同じくらい高速なソリューションを次に示します。sed

time awk '{print substr($0, 1, length($0)-8)}' 100k.txt

real    0m4.110s
user    0m0.142s
sys     0m0.422s

time sed "s/.\{0,8\}$//; /^$/d" 100k.txt

real    0m4.043s
user    0m1.558s
sys     0m0.345s

任意の数字に置き換えます8。ここでの主な違いは、awkトリム長が行の長さを超えた場合に は改行を印刷しますが、 はsed印刷しないことです。

答え4

Raku (旧称 Perl_6) の使用

raku -ne '.trim-trailing.chop(8).put;'

または

raku -pe '.=trim-trailing; .=chop(8);'

サンプル入力:

wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

サンプル出力:

wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_

trim-trailing上記の両方の回答では、末尾の空白を取り除くためにRaku のルーチンを使用していることに注意してください。文字列の右端から文字を削除したりtrim-trailing、文字数を調整したりしてもかまいません。chop

https://docs.raku.org/routine/chop
https://raku.org

関連情報