"붙여넣기"와 비슷하지만 구분 기호 뒤에 수직으로 정렬되어 있습니까?

"붙여넣기"와 비슷하지만 구분 기호 뒤에 수직으로 정렬되어 있습니까?

두 파일을 함께 붙여넣고 싶지만 섹션 구분선 뒤에 세로로 정렬되어 있습니다 ::. 그게 내 뜻이야.

콘텐츠 file1:

Apple
Banana
Carrot
::
Durian

콘텐츠 file2:

Energy
Flight
::
Gravity
Heartbreak

원하는 출력:

Apple Energy
Banana Flight
Carrot 
::
Durian Gravity
 Heartbreak

지금까지 나는 paste그럴 것이라는 것을 알고 있다거의file1내가 원하는 것을 수행합니다(멋진 수직 정렬 없이). 또 다른 옵션은 합계를 여러 파일로 분할 한 다음 결과를 함께 연결하는 것이지만 file2가능하면 이를 피하고 싶습니다. 어떻게 해야 하나요?

를 꼭 사용할 필요는 없습니다 paste. 작동하는 것은 모두 작동할 것입니다!

답변1

awk를 사용하십시오.

$ cat tst.awk
BEGIN {
    blockSep = "::"
}
FNR == 1 {
    numBlocks[++fileNr] = 0
}
(FNR == 1) || ($0 == blockSep) {
    numLines[fileNr,++numBlocks[fileNr]] = 0
}
$0 != blockSep {
    vals[fileNr,numBlocks[fileNr],++numLines[fileNr,numBlocks[fileNr]]] = $0
}
END {
    maxBlocks = ( numBlocks[1] > numBlocks[2] ? numBlocks[1] : numBlocks[2] )
    for ( blockNr=1; blockNr<=maxBlocks; blockNr++ ) {
        maxLines = ( numLines[1,blockNr] > numLines[2,blockNr] ? numLines[1,blockNr] : numLines[2,blockNr] )
        for ( lineNr=1; lineNr<=maxLines; lineNr++ ) {
            print vals[1,blockNr,lineNr], vals[2,blockNr,lineNr]
        }
        if ( blockNr < maxBlocks ) {
            print blockSep
        }
    }
}

$ awk -f tst.awk file1 file2
Apple Energy
Banana Flight
Carrot
::
Durian Gravity
 Heartbreak

답변2

이것은 하나입니다극도로::해킹된 솔루션은 두 파일에 공통된 줄만 있고 파일에 단일 단어(공백 없음)만 포함되어 있기 때문에 예제 데이터에 적합합니다 . 그래서 저는 그것이 매우 취약하고 전혀 보편적이지 않다고 생각합니다.

병렬 출력을 구문 분석하여 수직으로 정렬 diff됩니다 diff.

$ diff -y file1 file2 | awk -v OFS='\t' 'NF == 3 { print $1, $3; next } $2 == "<" { print $1; next } $1 == ">" { print "", $2; next } { print $1 }'
Apple   Energy
Banana  Flight
Carrot
::
Durian  Gravity
        Heartbreak

awk출력을 구문 분석하는 코드는 diff -y필드 수와 데이터의 특정 부분 내용을 기반으로 각 행의 선택된 부분을 출력합니다.

관련 정보