如何在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