私は初めてbashシェルスクリプトに触れたので、この質問をすでに受け取った場合は謝罪します。
複数のファイルの組み合わせがあります。たとえば、次のようになります。
USA.txt Florida.txt Miami.txt
これらのファイルを組み合わせて、すべての内容を含む新しいファイルを作成したいと思います。たとえば、次のようになります。
cat *.txt > USA_FLORIDA_MIAMI.txt
別のケースでは、ファイルに別のプレフィックスが付くことがあります。
Canada.txt Quebec.txt Montreal.txt
したがって、2番目の場合の出力はCANADA_QUEBEC_MONTREAL.txtになります。
cat *.txt > CANADA_QUEBEC_MONTREAL.txt
他のファイルのすべての組み合わせについても同様です。
最初のケースでは、USA.txt Florida.txt Miami.txtがディレクトリにある唯一の.txtファイルです。 2番目のケースでは、Canada.txt Quebec.txt Montréal.txtに置き換えられるため、その時点のディレクトリに存在するすべての.txtファイルのプレフィックス情報を常に結合して追加するコードを作成する必要があります。出力ファイルのプレフィックスに追加されます。ここで変数は国、州、都市名です。
利用可能なコマンドに関する提案はありますか?ありがとう
答え1
少しだけ使ってもいいと思います。Bashのパラメータ拡張文法。
基本的な状況は次のとおりです。
# Use a '_' as IFS value to concatenate arguments while expanding them
IFS=_
# Expand all arguments as "$*", removing their suffix if it matches ".txt"
names="${*%.txt}"
# Provide all arguments as "$@" to a `cat`, redirected to
# a file named as the concatenated names made uppercase
cat "${@?}" > "${names^^?}.txt"
# The ${@?} syntax prints an error if you don't provide arguments
次のような1行のコードとして使用できます。
bash -c 'IFS=_ names="${*%.txt}"; cat "${@?}" "${names^^?}.txt"' joiner USA.txt Florida.txt Miami.txt
または、次の機能を作成します。
joiner () {
local IFS=_
names="${*%.txt}"
cat "${@?}" > "${names^^?}.txt"
}
スクリプトに含めるか、source
対話型シェルで編集し、次のように使用します。
joiner USA.txt Florida.txt Miami.txt
答え2
汚れているが効果的です:
#!/bin/bash
files="$@"
new_file=()
function join_by { local IFS="$1"; shift; echo "$*"; }
for file in $files; do
prefix=$(echo $file | awk -F'.' '{print $1}')
new_file+=( $prefix )
cat $file >> temp_file.txt
done
new_name=$(join_by _ "${new_file[@]}")
mv temp_file.txt $new_name.txt
実行する
bash script_name.sh file.txt file2.txt file3.txt ...
ファイルをマージし、指定されたファイルに基づいてファイル名を生成します。