私は 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 行のサンプル ファイルを使用した、awk
frippe のアプローチと同じくらい高速なソリューションを次に示します。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