同じプレフィックスで始まる多数のファイルとファイルサブグループを含むUbuntuシステムにディレクトリがあります。次のように、ディレクトリファイル名にあるさまざまなプレフィックスのリストが必要です。リストの場合:
pj6_ex_18_i535_tr_92.pdf
pj6_ex_18_i535_tr_95.pdf
...
pj6_ex_14_i535_tr_96.pdf
pj6_ex_14_i535_tr_97.pdf
pj6_ex_14_i535_tr_98.pdf
....
pj1_ex_24_i535_tr_91.pdf
pj1_ex_24_i535_tr_92.pdf
pj1_ex_24_i535_tr_93.pdf
...
pj3_ex_16_i535_tr_23.pdf
pj3_ex_16_i535_tr_22.pdf
次のリストをインポートする必要があります。 awkコマンドでこれが可能になりそうですが、方法がわかりません。
pj6_ex_18_
pj6_ex_14_i535_
pj1_ex_24_i535_
pj3_ex_16_i535_
どうすればいいですか?
答え1
$ perl -lne '
s/_tr.*/_/;
unless (defined($prefixes) && m/^($prefixes)_/) {
$prefixes{$_}++;
$prefixes=join("|", map +( "\Q$_\E" ), keys %prefixes);
};
END { print join("\n", sort keys %prefixes) }' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_
あるいは、短く言うと、すべての一意のプレフィックスの代わりに表示される最後の行を追跡できます。
$ perl -lne '
next if (defined($last) && m/^\Q$last\E/);
s/_tr.*/_/;
$last=$_;
print' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_
両方のバージョンでは、マッチングアクション\Q
のと正規表現のメタ文字が含まれないようにします。たとえば、「リテラルとリテラル」などの内容が含まれている場合は、「ゼロ文字以上」と解釈されます。\E
m//
$last
.*
.
*