Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash/awk/other中进行转置_Bash_Awk_Transpose - Fatal编程技术网

如何在bash/awk/other中进行转置

如何在bash/awk/other中进行转置,bash,awk,transpose,Bash,Awk,Transpose,如何转换以下数据 colA colB colC colD val1 val2 val3 val4 val5 val6 val7 val8 所以它看起来像这样: colA val1 val5 colB val2 val6 colC val3 val7 colD val4 val8 此数据以制表符分隔,但也可以以逗号分隔 我可以在excel中很容易地做到这一点,但我想知道如何在bash中使用aw

如何转换以下数据

colA    colB    colC    colD
val1    val2    val3    val4
val5    val6    val7    val8
所以它看起来像这样:

colA    val1    val5
colB    val2    val6
colC    val3    val7
colD    val4    val8
此数据以制表符分隔,但也可以以逗号分隔

我可以在excel中很容易地做到这一点,但我想知道如何在bash中使用awk或类似的东西来做到这一点

编辑1

我可以让它与空间一起工作

$ cat testdata2_withspace.txt
colA colB colC colD
val1 val2 val3 val4
val5 val6 val7 val8

$ ./transpose3.sh testdata2_withspace.txt
colA val1 val5
colB val2 val6
colC val3 val7
colD val4 val8
但是,对于逗号分隔的文件,它并不是这样做的

$ cat testdata2.txt
colA,colB,colC,colD
val1,val2,val3,val4
val5,val6,val7,val8

$ ./transpose3.sh testdata2.txt
colA,colB,colC,colD val1,val2,val3,val4 val5,val6,val7,val8
有一个awk脚本可以工作:

#!/bin/bash 

transpose() 
{ 
  awk ' 
      BEGIN {
          FS = ",";
          OFS = ",";
      }

      { 
              if (max_nf<NF) 
                    max_nf=NF 
              max_nr=NR 
              for (x=1; x<=NF; ++x) 
                     vector[x, NR]=$x 
      } 

      END { 
              for (x=1; x<=max_nf; ++x) { 
                   for (y=1; y<=max_nr; ++y) 
                        printf("%s ", vector[x, y]) 
                   printf("\n") 
               } 
          }'  ${1} 
} 

transpose ${1} 
#/bin/bash
转置()
{ 
awk'
开始{
FS=“,”;
OFS=“,”;
}
{ 
如果(最大值)$cat tst.awk

{for(i=1;i由于问题标题由“/other”组成,我想发布一个Python+Bash的答案

以下内容适用于以制表符/空格分隔的文件,CSV需要进行细微调整

$ trans () { python2 -c 'print "\n".join("\t".join(t)for t in zip(*[l.split()for l in open("'"$1"'")]))' ; }
$ cat test2.csv
Roll_num Marks Grade
1        75    A
2        60    C
27       68    B
61       45    E
$ trans test2.csv 
Roll_num        1       2       27      61
Marks   75      60      68      45
Grade   A       C       B       E
根据定义,shell函数对于“funny”文件名应该是健壮的

$ cp test2.csv fun\ ny
$ trans fun\ ny
Roll_num        1       2       27      61
Marks   75      60      68      45
Grade   A       C       B       E
$
补遗 以下是CSV文件所需的小调整

$ trans, () { python2 -c'print"\n".join(",".join(r)for r in zip(*[[i.strip()for i in l.strip().split(",")]for l in open("'"$1"'")]))'; }
$ cat test111.csv
Sales #, Date, Tel Number, Comment
393ED3, 5/12/2010, 5555551212, left message
585E54, 6/15/2014, 5555551213, voice mail
585868, 8/16/2010, , number is 5555551214
$ trans, test111.csv
Sales #,393ED3,585E54,585868
Date,5/12/2010,6/15/2014,8/16/2010
Tel Number,5555551212,5555551213,
Comment,left message,voice mail,number is 5555551214

在此处选中“是”,这似乎适用于空格分隔的文件。如何更改它,使其适用于逗号分隔的文件?我看不到其中使用的字段分隔符的
-F
标志。我刚刚编辑了示例,将输入和输出字段分隔符设置为
$ trans, () { python2 -c'print"\n".join(",".join(r)for r in zip(*[[i.strip()for i in l.strip().split(",")]for l in open("'"$1"'")]))'; }
$ cat test111.csv
Sales #, Date, Tel Number, Comment
393ED3, 5/12/2010, 5555551212, left message
585E54, 6/15/2014, 5555551213, voice mail
585868, 8/16/2010, , number is 5555551214
$ trans, test111.csv
Sales #,393ED3,585E54,585868
Date,5/12/2010,6/15/2014,8/16/2010
Tel Number,5555551212,5555551213,
Comment,left message,voice mail,number is 5555551214