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行のサンプルファイルを使用して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_
上記の両方の答えは、Rakuのtrim-trailing
ルーチンを使用して末尾のスペースを削除します。trim-trailing
文字列の右端にある-ped文字数を自由に削除および/または調整します。chop