我想知道如何格式化以下输出:
-0.3116274D-04
-0.2389361D-04
-0.1192458D-04
0.3306203D-04
0.2534987D-04
0.1265136D-04
-0.2167920D-04
-0.3713258D-04
-0.2294900D-05
-0.4151710D-05
-0.7674479D-03
-0.5749288D-04
0.1393479D-04
0.6763913D-04
0.2515100D-05
-0.3638000D-06
-0.2630000D-06
-0.2445230D-06
0.1534680D-05
0.1579750D-04
0.2922010D-04
0.5390530D-04
0.8701990D-04
0.1132741D-03
0.9665700D-04
0.3337340D-04
-0.4121240D-05
分为五列,首先转置:
-0.3116274D-04 -0.2389361D-04 -0.1192458D-04 0.3306203D-04 0.2534987D-04
0.1265136D-04 -0.2167920D-04 -0.3713258D-04 -0.2294900D-05 -0.4151710D-05
-0.7674479D-03 -0.5749288D-04 0.1393479D-04 0.6763913D-04 0.2515100D-05
-0.3638000D-06 -0.2630000D-06 -0.2445230D-06 0.1534680D-05 0.1579750D-04
0.2922010D-04 0.5390530D-04 0.8701990D-04 0.1132741D-03 0.9665700D-04
0.3337340D-04 -0.4121240D-05
我的第一个方法是:
sed 's/\n//g' File | column -n
答案 0 :(得分:27)
试试这个:
printf "%14s %14s %14s %14s %14s\n" $(cat data.txt)
答案 1 :(得分:6)
answer traybold使用printf "%14s %14s %14s %14s %14s\n" $(cat data.txt)
并且应该使用,但请注意最后一行是空白填充到全宽。此外,如果数据文件非常大(可能是256 KiB;几乎可以肯定在达到1 MiB之前),那么printf
的命令行参数将用完空间。下面的解决方案将适用于大小为兆字节的文件,而不会对系统产生负面影响。
您几乎可以在多列模式(pr
)中使用pr -5 -l1 -t
,但它会对列进行左对齐,因此-
符号将无法正确显示。 OTOH,然后您可以将输出提供给awk以进行正确的调整:
pr -5 -l1 -t File | awk '{ printf "%14s %14s %14s %14s %14s\n", $1, $2, $3, $4, $5 }'
但如果您要将awk
拖入游戏中,它也可以为您进行“换位” - 但这需要更多的编码才能完成。
你的建议几乎可行,但当我尝试时,我得到:
0.8725220D- 0.1609633D- 0.2598447D-
;每个数字的指数都消失了。
pr
的一些奇迹。默认情况下,它使用选项卡分隔列。您可以使用-s' '
或通过指定输出宽度更宽(例如-w100
)来覆盖它。请注意,空格等参数值需要附加到选项中,至少在pr
的传统实现中是这样(但-w 100
可以正常工作)。
$ pr -s' ' -5 -l1 -t data | awk '{printf "%14s %14s %14s %14s %14s\n", $1, $2, $3, $4, $5}'
-0.3116274D-04 -0.2389361D-04 -0.1192458D-04 0.3306203D-04 0.2534987D-04
0.1265136D-04 -0.2167920D-04 -0.3713258D-04 -0.2294900D-05 -0.4151710D-05
-0.7674479D-03 -0.5749288D-04 0.1393479D-04 0.6763913D-04 0.2515100D-05
-0.3638000D-06 -0.2630000D-06 -0.2445230D-06 0.1534680D-05 0.1579750D-04
0.2922010D-04 0.5390530D-04 0.8701990D-04 0.1132741D-03 0.9665700D-04
0.3337340D-04 -0.4121240D-05
$ pr -w 100 -5 -l1 -t data | awk '{printf "%14s %14s %14s %14s %14s\n", $1, $2, $3, $4, $5}'
-0.3116274D-04 -0.2389361D-04 -0.1192458D-04 0.3306203D-04 0.2534987D-04
0.1265136D-04 -0.2167920D-04 -0.3713258D-04 -0.2294900D-05 -0.4151710D-05
-0.7674479D-03 -0.5749288D-04 0.1393479D-04 0.6763913D-04 0.2515100D-05
-0.3638000D-06 -0.2630000D-06 -0.2445230D-06 0.1534680D-05 0.1579750D-04
0.2922010D-04 0.5390530D-04 0.8701990D-04 0.1132741D-03 0.9665700D-04
0.3337340D-04 -0.4121240D-05
$
所有这些pr | awk
解决方案将最后一行空白填充为全宽。
以下是两个在一个命令中完成工作的等效awk
脚本。一个将代码分为两行,另一行分为16行(但更容易阅读):
选项1:
awk '{ a[i++] = $0; if (i == 5) { printf "%14s %14s %14s %14s %14s\n", a[0], a[1], a[2], a[3], a[4]; i = 0; } }
END { if (i > 0) { printf "%14s", a[0]; for (j = 1; j < i; j++) printf " %14s", a[j]; printf "\n"; } }' data
选项2:
awk '{ a[i++] = $0
if (i == 5)
{
printf "%14s %14s %14s %14s %14s\n", a[0], a[1], a[2], a[3], a[4]
i = 0
}
}
END {
if (i > 0)
{
printf "%14s", a[0]
for (j = 1; j < i; j++)
printf " %14s", a[j]
printf "\n"
}
}' data
输出与之前相同,只是这些空白填充都不是最后一行:
-0.3116274D-04 -0.2389361D-04 -0.1192458D-04 0.3306203D-04 0.2534987D-04
0.1265136D-04 -0.2167920D-04 -0.3713258D-04 -0.2294900D-05 -0.4151710D-05
-0.7674479D-03 -0.5749288D-04 0.1393479D-04 0.6763913D-04 0.2515100D-05
-0.3638000D-06 -0.2630000D-06 -0.2445230D-06 0.1534680D-05 0.1579750D-04
0.2922010D-04 0.5390530D-04 0.8701990D-04 0.1132741D-03 0.9665700D-04
0.3337340D-04 -0.4121240D-05
编写代码会更容易也更短;重置代码也会delete a
清除数组,END块只会测试i
并使用主代码中的printf
:
awk '{ a[i++] = $0
if (i == 5)
{
printf "%14s %14s %14s %14s %14s\n", a[0], a[1], a[2], a[3], a[4]
i = 0
delete a
}
}
END {
if (i > 0) printf "%14s %14s %14s %14s %14s\n", a[0], a[1], a[2], a[3], a[4]
}' data
答案 2 :(得分:0)
ol'pr命令用于此类工作 - 特别是如果您希望这些列垂直而不是水平。
但是,我会使用printf
,它允许我保持文本的宽度不变,然后使用计数器和modulo运算符来计算我在一行中有五个项目。 模数运算符有时称为余数运算符。但是,它的功能类似于时钟:
#!/bin/bash
#
count=0
while read number
do
((count+=1))
printf "%14.14s " $number
if ((count % 5 == 0))
then
printf "\n"
fi
done < $file
printf "\n"
printf
的格式缺少减号(即%-14.14s
),这会强制文本与右侧而不是左侧对齐。这样,减号不会让我失望。
答案 3 :(得分:0)
$ awk '{ORS=(NR%5?FS:RS)}1' file
-0.3116274D-04 -0.2389361D-04 -0.1192458D-04 0.3306203D-04 0.2534987D-04
0.1265136D-04 -0.2167920D-04 -0.3713258D-04 -0.2294900D-05 -0.4151710D-05
-0.7674479D-03 -0.5749288D-04 0.1393479D-04 0.6763913D-04 0.2515100D-05
-0.3638000D-06 -0.2630000D-06 -0.2445230D-06 0.1534680D-05 0.1579750D-04
0.2922010D-04 0.5390530D-04 0.8701990D-04 0.1132741D-03 0.9665700D-04
0.3337340D-04 -0.4121240D-05 $
请注意,如果行数不是5的倍数,它不会在最后添加换行符。这是一个问题吗?
答案 4 :(得分:0)
有点棘手的选择:
columnPrint(){
select foo in $(cat); do break; done; <<!SELECTEOF
1
!SELECTEOF
};
cat data.txt | columnPrint;
# or simply columnPrint < data.txt
与@traybold方法相比,它的缺点是项目已编号(可能不是您想要的),但它还具有自动调整列数到输入字符串和终端宽度的优点。