İki veya daha fazla dosyanın satırlarını nasıl eklerim?


10

2 dosya çıktısını tek bir dosyada almaya çalıştım. Aşağıdaki komutu denedim:

cat file1 file2

ancak burada file2veriler ekleniyor file1.

İhtiyacım olan file1ilk satırın ardından file2ilk satır ve file1ikinci satırın ardından file2ikinci satır vb.

Biri bana bunu nasıl basit bir şekilde yapacağımı söyleyebilir mi?

Yanıtlar:


17

Bunun için bir uygulama var!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

Şimdi, bu dosyaları bağımsız değişken olarak iletirseniz paste:

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

"1. dosya 1. satır ve ardından dosya2 ilk satır ve ardından dosya2 ikinci satır, ardından dosya2 ikinci satır vb." İle yapıştırılırsa, yapıştırılan her satır arasında yeni bir satır olmasını istiyorsanız, -d(sınırlayıcı) seçeneğini ayarlayın .

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

2

POSIX Awk; bu, rastgele miktarda dosyayla çalışır ve dosyaların aynı miktarda satıra sahip olması gerekmez. Tüm dosyalar satır dışına çıkıncaya kadar komut dosyası devam eder:

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

Bununla ilgili bir sorun var, giriş '%' karakterleri içeriyorsa, bunları printf içinde değerlendirmeye çalıştı. Güncellemem şu olurdu (bunun tam olarak doğru olduğundan emin değilim):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William

0

Hızlı bash çözümü

# 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 dosya1 dosya2 dosya3 dosya4


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

nerede file1ve file2girdi dosyaları ve file3oluşturulan çıktı olacaktır.


1
U&L Stack Exchange'e hoş geldiniz! Bu cevap terdon'un cevabı ile hemen hemen aynı . Bir yanıta görebileceğinizi ancak önemli ölçüde yeni bilgi sağlamadığınızı düşündüğünüz durumlarda, lütfen mevcut bir yanıta düzenleme önermeyi düşünün . Cevaplar da oylamaya göre yeniden sıralanır, bu nedenle her cevap kendi başına durmalı veya diğer cevaba başvurmalıdır. Bu yüzden kabuk onelinerlerine operasyonlarını açıklayan bir açıklama eşlik etmelidir.
Thomas Nyman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.