次のディレクトリに.csvファイルセットがあります。
abc_q1_w1.csv
defg_q11_w2.csv
hijk_q11_w3.csv
部分的なファイル名を抽出して列に入れるスクリプトを作成したいと思います。
abc q1 w1
defg q11 w2
hijk q11 w3
bashスクリプトを使用してこの種のファイル名抽出を実装する方法を知っている人はいますか?
答え1
次のようなものを使用できます。
ls -1 | tr '_' '\t'
答え2
sedを使う
$ printf "%s\n" * | sed 's/.csv$//; s/_/\t/g'
abc q1 w1
defg q11 w2
hijk q11 w3
仕組み:
printf "%s\n" *
1行に1つのファイル名を印刷します。s/.csv$//
末尾を削除します.csv
。s/_/\t/g
_
タブ文字に変換します。
バッシュを使って
$ for f in *; do f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}"; done
abc q1 w1
defg q11 w2
hijk q11 w3
明確にするために、上記のコードを複数行に分割できます。
for f in *
do
f="${f%.csv}"
printf "%s\n" "${f//_/$'\t'}"
done
${f%.csv}
末尾の文字を削除し、.csv
すべて${f//_/$'\t'}
タブ_
に変換します。
echo
ファイル名の1つで始まる場合、多くのシェルは-
ファイル名をオプションとして解釈しようとしますが、うまく機能しないため、この操作は使用されません。
別のディレクトリでコードを実行する
$ for f in "$dir"/*; do f="${f#$dir/}"; f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}"; done
abc q1 w1
defg q11 w2
hijk q11 w3