Как чередовать строки двух и более файлов?

10

Я попытался получить вывод 2 файлов в одном файле. Я попробовал ниже команды:

cat file1 file2

но здесь file2данные дополняют file1.

Что мне нужно, так это file11-я строка, за которой следует file2первая строка, а за file1второй строкой следует file2вторая строка и т. Д.

Кто-нибудь может сказать мне, как это сделать простым способом?

user73553
источник

Ответы:

17

Для этого есть приложение!

$ 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 1-ая строка, за которой следует file2 первая строка, и file1, вторая строка, за которой следует file2 вторая строка и т. Д.», Вы имеете в виду, что вы хотите новую строку между каждой вставленной строкой, просто настройте -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)
}
Стивен Пенни
источник
С этим связана одна проблема: если входные данные содержат символы «%», они пытаются вывести их в printf. Мое обновление будет (я не уверен, что это совершенно правильно):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William
0

Быстрое решение bash

# 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

Орсирис де Йонг
источник
-2
paste -d '\n' file1 file2 > file3

где file1и file2являются входными файлами и file3будут создаваемым выходом.

Пратик Сингх
источник
1
Добро пожаловать на U & L Stack Exchange! Этот ответ почти идентичен ответу Тердона . В тех случаях, когда вы считаете, что можете улучшить ответ, но не предоставляете существенно новую информацию, рассмотрите возможность изменения существующего ответа . Ответы также переупорядочиваются на основе голосования, поэтому каждый ответ должен стоять самостоятельно или ссылаться на другой ответ. Вот почему оболочки оболочек должны сопровождаться описанием, объясняющим их работу.
Томас Найман