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


10

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

cat file1 file2

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

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

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

Ответы:


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! Этот ответ почти идентичен ответу Тердона . В тех случаях, когда вы считаете, что можете улучшить ответ, но не предоставляете существенно новую информацию, рассмотрите возможность изменения существующего ответа . Ответы также переупорядочиваются на основе голосования, поэтому каждый ответ должен стоять самостоятельно или ссылаться на другой ответ. Вот почему оболочки оболочек должны сопровождаться описанием, объясняющим их работу.
Томас Найман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.