두 파일을 함께 붙여넣고 싶지만 섹션 구분선 뒤에 세로로 정렬되어 있습니다 ::
. 그게 내 뜻이야.
콘텐츠 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
필드 수와 데이터의 특정 부분 내용을 기반으로 각 행의 선택된 부분을 출력합니다.