同じ名前で始まるファイルをマージしたいです。

同じ名前で始まるファイルをマージしたいです。

以下のように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

関連情報