テキストファイルをマージする方法 - Bashスクリプト

テキストファイルをマージする方法 - Bashスクリプト

テキストファイルをパラメータとしてインポートしてマージするスクリプトを作成したいと思います。

  • すべてのファイルは、空白行で区切られたグループ化された行で構成されています。
  • スクリプトは2つ以上のパラメータを受け入れることができます。
  • ファイルにはより多くのグループを含めることができます。
  • ファイルのグループ数が異なる場合、あるファイルのグループが終了したら、他のファイルの残りのグループを次の順序で順次追加する必要があります。111-211-121-122-221-222-223-131-132-133-231-241-251-261-271

    ファイルをstdoutにマージしたいです。出力は、「最初のファイルの最初のセット、2番目のファイルの1番目のセット、1番目のファイルの2番目のセット...」でなければなりません。

    ファイルの行形式は、次のように「ファイル番号_グループ番号_行番号」と仮定します。

01_01_01

01_02_01
01_02_02
01_02_03

01_03_01
02_01_01
02_01_02

02_02_01

02_03_01
02_03_02

その後、出力は次のようになります。

01_01_01
02_01_01
01_02_01
01_02_02
01_02_03
02_02_01
01_03_01
02_03_01
02_03_02

試してみましたが、paste問題が発生しました。

#!/bin/bash
paste -d "\n\n" $1 $2  | sed '/^[[:space:]]*$/d'

出力は次のとおりです。

01_01_01
02_01_01
02_01_02
01_02_01
01_02_02
02_02_01
01_02_03
02_03_01
01_03_01
02_03_02

また、各行がどのファイルから来たのかを確認したいと思います。次のように各行の先頭にファイル番号を追加するにはどうすればよいですか?

1:01_01_01
2:02_01_01
1:01_02_01
1:01_02_02
1:01_02_03
2:02_02_01
1:01_03_01
2:02_03_01
2:02_03_02

ベストアンサー1

純粋なbashでは、ファイル記述子の助けを借りてこれを行うことができます。

file1="$1"; file2="$2"
__print() {
  [[ $1 ]] && { printf '1: %s\n' "$1"; }
  [[ $2 ]] && { printf '2: %s\n' "$2"; }
}
if [[ $file1 ]] && [[ $file2 ]]; then
    while true; do
      read -r f1 <&3 || break
      read -r f2 <&4 || break
      __print "$f1" "$f2"
    done 3<"${file1}" 4<"${file2}"
else
    echo "Usage: '$0 <file1> <file2>'"
fi

次の出力を提供します。

1: 01_01_01
2: 02_01_01
2: 02_01_02
1: 01_02_01
1: 01_02_02
2: 02_02_01
1: 01_02_03
2: 02_03_01
1: 01_03_01
2: 02_03_02

おすすめ記事