我有 1 个 csv 数据,包含多列,没有标题:
5,-3,0
3,2,5
-2,4,4
0,2,1
2,-1,-2
然后我想将其转置为单列,从第一列开始。预期输出如下:
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2
有人知道如何解决这个问题吗?
我所做的是使用Excel公式:=INDEX($A$1:$C$4,1+INT((ROW(A1)-1)/COLUMNS($A$1:$C$4)),MOD(ROW(A1)-1+COLUMNS($A$1:$C$4),COLUMNS($A$1:$C4))+1)
并以单列结束但从第一行开始。
我正在寻找更快的方法来做到这一点,例如使用脚本。
答案1
假设您的输入文件并不是绝对庞大(例如数百万行数百万个字段),因此可以容纳在内存中,然后在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ awk -F',' '
{ for (i=1; i<=NF; i++) a[NR,i]=$i }
END { for (i=1; i<=NF; i++) for (j=1; j<=NR; j++) print a[j,i] }
' file
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2
答案2
awk
如果您有 Gnu,另一种方法datamash
是执行简单的转置,指定,
为 separa-t
或
datamash transpose -t, < file
5,3,-2,0,2
-3,2,4,2,-1
0,5,4,1,-2
然后你可以通过管道将其替换,
为\n
tr
datamash transpose -t, < file | tr ',' '\n'
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2
答案3
我们可以使用该itertools
模块及其函数chain
来链接迭代器并按顺序打印它们。
python3 -c '
import sys, itertools as it
fs,rs = ",","\n"
with open(sys.argv[1]) as f:
L = []
for l in f:
F = l.rstrip(rs).split(fs)
if not len(L):
L += [[] for i in range(0,len(F))]
for nc,e in enumerate(F):
L[nc].append(e)
for x in it.chain(*L): print(x)
' file
输出:-
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2