Bagaimana cara interleave baris dua file atau lebih?


10

Saya sudah mencoba mendapatkan 2 file output dalam satu file. Saya telah mencoba perintah di bawah ini:

cat file1 file2

tetapi di sini file2data ditambahkan ke file1.

Yang saya butuhkan adalah file1baris pertama diikuti oleh file2baris pertama, dan file1baris kedua diikuti oleh file2baris kedua, dll.

Adakah yang bisa memberi tahu saya cara melakukan ini dengan cara yang sederhana?

Jawaban:


17

Ada aplikasi untuk itu!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

Sekarang, jika Anda meneruskan file-file ini sebagai argumen untuk paste:

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

Jika dengan "file1 baris pertama diikuti oleh file2 baris pertama, dan file1 baris kedua diikuti oleh file2 baris kedua dll", Anda berarti bahwa Anda ingin baris baru di antara setiap baris yang disisipkan, cukup sesuaikan opsi -d(pembatas).

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

2

POSIX Awk; ini berfungsi dengan jumlah file yang sewenang-wenang, dan file-file itu bahkan tidak harus memiliki jumlah baris yang sama. Skrip terus berjalan hingga semua file keluar dari baris:

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

Ada satu masalah dengan itu, jika input berisi karakter '%' itu mencoba untuk mengevaluasi mereka di dalam printf. Pembaruan saya adalah (Saya tidak yakin ini sepenuhnya benar):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William

0

Solusi bash cepat

# 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


-2
paste -d '\n' file1 file2 > file3

dimana file1danfile2 merupakan file input dan file3akan menjadi output yang dibuat.


1
Selamat datang di U&L Stack Exchange! Jawaban ini hampir identik dengan jawaban terdon . Dalam kasus di mana Anda berpikir Anda dapat memperbaiki jawaban, tetapi tidak memberikan informasi yang secara substansial baru, silakan pertimbangkan untuk mengusulkan edit pada jawaban yang ada . Jawaban juga disusun ulang berdasarkan pemungutan suara, sehingga setiap jawaban harus berdiri sendiri atau merujuk ke jawaban lainnya. Itu sebabnya oneliners shell harus disertai dengan deskripsi yang menjelaskan operasi mereka.
Thomas Nyman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.