簡體   English   中英

使用 gawk 轉置列和行

[英]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 

學分:

希望這可以幫助。

這可以通過rs BSD 命令來完成:

http://www.unix.com/man-page/freebsd/1/rs/

檢查-T選項。

我嘗試了 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM