使用gawk转置列和行
我正在尝试转置一个非常长的文件,我担心它不会被完全转置 我的数据如下所示:使用gawk转置列和行,awk,row,transpose,gawk,Awk,Row,Transpose,Gawk,我正在尝试转置一个非常长的文件,我担心它不会被完全转置 我的数据如下所示: 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 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
我希望我的数据如下所示:
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行。还可以将第一个字符串的名称更改为IS234,然后进行转置吗?我不明白为什么不可以-除非您没有足够的内存。试试下面的方法,看看你是否遇到了问题 输入:
$ 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
学分:
希望这有帮助。这可以通过
rs
BSD命令完成:
查看
-T
选项。我尝试了icyrock.com的答案,但发现我必须更改:
for(r = 1; r <= NR; r++) {
for(c = 1; c <= max_nf; c++) {
你会得到:
a 1 .
b 2 ,
c 3 +
i、 e.仍有3行4列(最后一行为空)。对于@ScubaFishi和@icyrock代码:
“if(max_nf
gawk
也可以接受。是的,您可以修剪长名称;设计算法并应用于输出或输入过程中。这很好:OSX中也有可用(库存)。它有很多特点。我建议阅读手册页。
a b c d
1 2 3 4
. , + -
a 1 .
b 2 ,
c 3 +