두 개 이상의 파일 라인을 인터리빙하는 방법은 무엇입니까?


10

하나의 파일로 2 개의 파일을 출력하려고했습니다. 아래 명령을 시도했습니다.

cat file1 file2

그러나 여기에 file2데이터가 추가됩니다 file1.

내가 필요한 것은 file1첫 번째 줄 다음에 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 첫 번째 줄 뒤에 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

빠른 배쉬 솔루션

# 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
}

인터리브 파일 file1 file2 file3 file4


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

입력 파일의 위치 file1와 위치 는 생성 된 출력이됩니다.file2file3


1
U & L 스택 교환에 오신 것을 환영합니다! 이 답변은 terdon의 답변 과 거의 동일합니다 . 답변을 개선 할 수 있지만 실질적으로 새로운 정보를 제공하지 않는 경우 기존 답변에 대한 수정 제안을 고려하십시오 . 답변은 투표에 따라 순서가 정해 지므로 각 답변은 자체적으로 답변하거나 다른 답변을 참조해야합니다. 셸 oneliners는 작업을 설명하는 설명을 동반 해야하는 이유입니다.
Thomas Nyman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.