[英]transpose column and rows using 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 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,然后轉置嗎?
我不明白為什么它不會 - 除非你沒有足夠的 memory。試試下面的方法,看看你是否遇到問題。
輸入:
$ 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
學分:
希望這可以幫助。
我嘗試了 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 列(最后一列是空白的)。
對於@ScubaFishi 和@icyrock 代碼:
“if (max_nf < NF)”似乎是不必要的。 我刪除了它,代碼工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.