複数のファイル行をインターリーブする方法は?

複数のファイル行をインターリーブする方法は?

2つのファイルを1つのファイルとして出力しようとしています。次のコマンドを試しました。

cat file1 file2

しかし、ここではfile2データがfile1

私が必要とするのは、最初の行、file1最初の行、2番目の行、2番目の行などです。file2file1file2

誰でも簡単な方法でこれを行う方法を教えてもらえますか?

答え1

これのためのアプリがあります!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

次のファイルをパラメータとして渡すpaste

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

「file1の最初の行の後にfile2の最初の行が続き、file1の2行目の後にfile2の2行目が続く」とは、貼り付ける各行の間に新しい行が必要なことを意味します-d。 (区切り記号)オプションを調整するだけです。

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2

答え2

POSIX awk;これは複数のファイルで機能し、ファイルの行数が同じである必要はありません。すべてのファイルが行数を超えるまで、スクリプトは実行を続けます。

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}

答え3

クイックソリューション

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles ファイル 1 ファイル 2 ファイル 3 ファイル 4

答え4

paste -d '\n' file1 file2 > file3

file1file2入力ファイルで、file3生成された出力になります。

関連情報