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)