![类似“粘贴”但在分隔符后垂直对齐的东西?](https://linux22.com/image/214557/%E7%B1%BB%E4%BC%BC%E2%80%9C%E7%B2%98%E8%B4%B4%E2%80%9D%E4%BD%86%E5%9C%A8%E5%88%86%E9%9A%94%E7%AC%A6%E5%90%8E%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90%E7%9A%84%E4%B8%9C%E8%A5%BF%EF%BC%9F.png)
我想将两个文件粘贴在一起,但在节分隔符行之后垂直对齐::
。这就是我的意思。
内容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
字段数量和数据某些部分的内容输出每行的选定部分。