「貼り付け」に似ていますが、区切り文字の後ろに垂直に配置されていますか?

「貼り付け」に似ていますが、区切り文字の後ろに垂直に配置されていますか?

2つのファイルを一緒に貼り付けたいのですが、セクションの区切り線の後に垂直に配置されています::。それは私の意味です。

コンテンツ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

これは一つです極度に::ハッキングされたソリューションは、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フィールドの数とデータの特定の部分の内容に基づいて各行の選択された部分を出力します。

関連情報