列からcsvファイル名の一部を抽出する

列からcsvファイル名の一部を抽出する

次のディレクトリに.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

関連情報