ファイル行から最後のn文字を削除する

ファイル行から最後のn文字を削除する

data_list.txt私はMac端末(bash)を使用しており、次の行を含むファイルがあります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

正確な入力のために(最後の行を除くすべての行の末尾にスペースがあります)、これを使用できます(「after_part」を削除したいようです:

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_

上記の両方の答えは、Rakuのtrim-trailingルーチンを使用して末尾のスペースを削除します。trim-trailing文字列の右端にある-ped文字数を自由に削除および/または調整します。chop

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

関連情報