以下のように100個を超えるファイルが複数あり、同じ名前のファイルをまとめて1つのファイルにマージする必要があります。
AB_HCE_USERS_20221228_001.txt
AB_HCE_USERS_20221228_002.txt
AB_HCE_TASKS_20221228_001.txt
AB_HCE_TASKS_20221228_002.txt
AB_HCE_TASKS_20221228_003.txt
AB_HCE_ASSESSMENTS_20221228_001.txt
AB_HCE_ASSESSMENTS_20221228_002.txt
AB_HCE_CONTACT_20221228_003.txt
AB_HCE_CONTACT_20221228_004.txt
AB_HCE_CONSUMERS_20221228_001.txt
AB_HCE_VERIFICATION_20221228_001.txt
AB_HCE_VERIFICATION_20221228_002.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228_001.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228_002.txt
...
希望の出力:
AB_HCE_USERS_20221228.txt
AB_HCE_TASKS_20221228.txt
AB_HCE_ASSESSMENTS_20221228.txt
AB_HCE_CONTACT_20221228.txt
AB_HCE_CONSUMERS_20221228.txt
AB_HCE_VERIFICATION_20221228.txt
AB_HCE_CONSUMER_RELATIONSHIP_20221228.txt
..
答え1
そしてawk
:
#!/bin/bash
for file in AB*.txt; do
awk -F'_[0-9]+.txt$' '{
system("cat "$0" >> ("$1".txt"));
close($1".txt")
}' <<< "$file"
done
答え2
そしてgawk
:
gawk '
BEGINFILE {out = FILENAME; sub(/_[^_]*$/, ".txt", out)}
{print > out}' ./*_[[:digit:]][[:digit:]][[:digit:]].txt
これにより、行区切り文字のない行に行区切り文字が追加されます。これを防ぐには、print
に置き換えてください。printf "%s", $0 RT
特定のファイルのソースファイルがすべて空の場合、その出力ファイルは作成または切り捨てられません。この問題を解決するために、printf "" > out
宣言に1つを追加できます。BEGINFILE
zsh
上記の制限なしで000〜999の数字に制限されずにを使用してください(n
ファイル名を数字でソートするにはglob修飾子を使用してください)。
typeset -A map=()
for f (*_<->.txt(NDn.)) map[${f%_*}]+=$f$'\0'
for out files (${(kv)map}) cat -- ${(0)files} > $out.txt
答え3
Bashのシンプルモード:
for i in AB_*; do
cat $i >> ${i%_*}.txt
done
競合の可能性を避けるために、新しいファイル用に別々のディレクトリを作成することをお勧めします。cat $i >> my_dir/${i%_*}.txt
マスクを次のように変更することもできます。for i in AB_*_[0-9][0-9][0-9].txt