web-dev-qa-db-ja.com

2つ以上のファイルの行をインターリーブする方法は?

2つのファイルを1つのファイルに出力しようとしました。私は以下のコマンドを試しました:

cat file1 file2

しかし、ここではfile2データがfile1に追加されています。

必要なのは、file1の1行目にfile2の1行目が続き、file1 2行目にfile2の2行目に続くものです。

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

10
user73553

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

$ 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
17
terdon

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)
}
2
Steven Penny

クイックバッシュソリューション

# 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 file1 file2 file3 file4

0
Orsiris de Jong