调整两列之间的间隙,使它们看起来笔直

调整两列之间的间隙,使它们看起来笔直

file1.txt:

hi
wonderful
amazing
sorry
superman
superhumanwith
loss

file2.txt:

1
2
3
4
5
6
7

当我尝试使用 Paste -d" " file1.txt file2.txt >actualout.txt 进行组合时

actualout.txt:

hi 1
wonderful 2
amazing 3
sorry 4
superman 5
superhumanwith 6
loss 7

但我希望我的输出看起来像这样

OUT.txt:

hi             1
wonderful      2
amazing        3 
sorry          4
superman       5 
superhumanwith 6
loss           7

哪个命令可用于组合 2 个文件,使其看起来像所需的输出? Solaris 5.10 ksh nawk、sed、粘贴

答案1

你似乎需要column

paste file1.txt file2.txt | column -tc2

它创建了这个输出:

hi              1
wonderful       2
amazing         3
sorry           4
superman        5
superhumanwith  6
loss            7


当然,您也可以编写自己的脚本来进行格式化。这是使用的一种方法awk

awk '
  NR==FNR { a[FNR] = $0 ; if (length > max) max = length ; next }
  { printf "%-*s  %s\n", max, a[FNR], $0 }
' file1.txt file2.txt

答案2

pr

我可能会选择pr

printf %s\\n hi wonderful amazing sorry  \
             superman superhumanwith loss >/tmp/file
#^what is all of that, anyway?^

seq 7 | pr -tm /tmp/file -

pr可以-m合并输入文件(此处/tmp/file-标准输入)逐行像paste逐列一样,但它可以采取许多除此之外的其他参数。默认情况下,它也会打印页眉和页脚,但-t会压缩它们。

输出:

hi                      1
wonderful               2
amazing                 3
sorry                   4
superman                5
superhumanwith          6
loss                    7

expand

如果您有兴趣自己获得更具体的信息,另一种选择是expand- 因为您可以向它提供一个虚拟制表位列表,它会扩张填充所需的空间。

seq 7 | paste /tmp/file - | expand -t15

-t当然,这里我们只需要第一个abstop......

hi             1
wonderful      2
amazing        3
sorry          4
superman       5
superhumanwith 6
loss           7

...但是如果想要更多...

seq 14 | paste /tmp/file - /tmp/file - | expand -t15,23,38,46

...我们可以用逗号分隔的复合列表来拼写它们...

hi             1       hi             2
wonderful      3       wonderful      4
amazing        5       amazing        6
sorry          7       sorry          8
superman       9       superman       10
superhumanwith 11      superhumanwith 12
loss           13      loss           14

grep:

要查找文件中最长行的长度,并且不计算任何尾随空格,并按标准 8 字符制表位位置递增,这可能会起作用:

i=0
while grep -Eq ".{$(((i+=8)-1))}.*[^[:blank:]]" <infile; do :; done

$i每次运行和搜索该循环都会增加8<infile对于任何包含至少与计数的字符一样多的行,$i后跟任何非空白字符。因此,当grep找不到这样的行时,它将返回 false,并且对于您的示例数据,它将分配:

echo "$i"
16

wc:

但这些都是 POSIX 解决方案。在 GNU 系统上做的最简单的事情是:

wc -L <infile

...列出最长线的长度<infile,但这将包括尾随空格的计数。

答案3

如果你坚持这样做awk

awk -v file=file2.txt '{
        cnt++
        a[cnt] = $0
        getline b[cnt] <file
        if(length(a[cnt]) > max)
            max = length(a[cnt])
    }
    END {
        max++
        for(i = 1; i <= cnt; i++)
            printf "%-" max "s%s\n", a[i], b[i]
    }' file1.txt

旁注:我很确定这个特殊的轮子已经被重新发明了无数次,但现在我不想强迫我的大脑想出正确的咒语来找到先前 SE / SO 的正确例子艺术。 :)

答案4

好吧,我找到了自己想要的东西。这适用于 Solaris 5.10。

paste file1 file2| pr -t -e$(awk 'n<length {n=length} END {print n+1}' file1)

我将最长字符串的长度存储在第一个文件中并使用它来制表符分隔

多文件场景

如果我们知道哪个文件将具有最长的单词,我将在计算长度时替换该文件名并使用粘贴来连接多个文件。如果 file4.txt 具有最长的字符串。那么解决方案是

paste file1 file2 file3 file4 | pr -t -e$(awk 'n<length {n=length} END {print n+1}' file4)

相关内容