我试图转置一个非常长的文件,我担心它不会被完全转置。
我的数据看起来像这样:
Thisisalongstring12345678 1 AB abc 937 4.320194
Thisisalongstring12345678 1 AB efg 549 0.767828
Thisisalongstring12345678 1 AB hi 346 -4.903441
Thisisalongstring12345678 1 AB jk 193 7.317946
我希望我的数据看起来像这样:
Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678 Thisisalongstring12345678
1 1 1 1
AB AB AB AB
abc efg hi jk
937 549 346 193
4.320194 0.767828 -4.903441 7.317946
第一个字符串的长度是否会成为问题?我的文件比这长约2000行长得多。也可以将第一个字符串的名称更改为Thisis234,然后转置?
答案 0 :(得分:7)
我不明白为什么它不会 - 除非你没有足够的记忆。试试下面的内容,看看你是否遇到了问题。
输入:
$ cat inf.txt
a b c d
1 2 3 4
. , + -
A B C D
Awk计划:
$ cat mkt.sh
awk '
{
for(c = 1; c <= NF; c++) {
a[c, NR] = $c
}
if(max_nf < NF) {
max_nf = NF
}
}
END {
for(r = 1; r <= NR; r++) {
for(c = 1; c <= max_nf; c++) {
printf("%s ", a[r, c])
}
print ""
}
}
' inf.txt
执行命令
$ ./mkt.sh
a 1 . A
b 2 , B
c 3 + C
d 4 - D
现金:
希望这有帮助。
答案 1 :(得分:5)
答案 2 :(得分:3)
我尝试了icyrock.com的回答,但发现我必须改变:
for(r = 1; r <= NR; r++) {
for(c = 1; c <= max_nf; c++) {
到
for(r = 1; r <= max_nf; r++) {
for(c = 1; c <= NR; c++) {
获取NR列和max_nf行。所以icyrock的代码变成了:
$ cat mkt.sh
awk '
{
for(c = 1; c <= NF; c++) {
a[c, NR] = $c
}
if(max_nf < NF) {
max_nf = NF
}
}
END {
for(r = 1; r <= max_nf; r++) {
for(c = 1; c <= NR; c++) {
printf("%s ", a[r, c])
}
print ""
}
}
' inf.txt
如果你不这样做并使用非对称输入,例如:
a b c d
1 2 3 4
. , + -
你得到:
a 1 .
b 2 ,
c 3 +
即。仍有3行4列(最后一行为空白)。
答案 3 :(得分:0)
对于@ ScubaFishi和@ icyrock代码:
&#34; if(max_nf&lt; NF)&#34;似乎没必要。我删除了它,代码工作得很好。