unix 如何根据列标题对csv文件进行排序?

zrfyljdw  于 2023-05-28  发布在  Unix
关注(0)|答案(2)|浏览(172)

我有一个CSV文件,它有231列,从1到231。然而,从另一个程序导出后,结果文件中的所有列都是随机顺序的,即第一列是样品15,然后是样品168,然后是样品2
文件看起来像这样:

taxon name, sample 7, sample 205, sample 56,.....
species A, 50,307,698.......
.
.
.
.

我如何得到一个输出文件,这是以下方式

taxon name, sample 1, sample 2,..., Sample 231 
Species A,658, 542,753
Species B,...,...,...
.
.
.

到目前为止尝试过:

perl -F, -lane 'print join ",", sort @F'

最后得到101,..109,10,110,...,119,等等
物种的顺序无关紧要,只要该物种的数量与相应的样本相匹配
提前感谢您的帮助!

ibrsph3r

ibrsph3r1#

假设所有行都有231个样本,并且所有逗号都是字段分隔符,您可以尝试以下awk脚本:

awk -F, 'NR==1 {for(i=2;i<=NF;i++) {n=$i; sub(/.* /,"",n); a[n]=i}}
  {printf("%s", $1); for(i=1;i<NF;i++) printf(",%s",$a[i]); print ""}' file.csv
0x6upsns

0x6upsns2#

安装xsv并尝试这个 *bash脚本 *。

#!/bin/bash

INPUT="${1}"
SORT_COLUMNS=$(xsv headers "${INPUT}" | sort -k2 | awk '{printf $1","}')

xsv select "${SORT_COLUMNS}" "${INPUT}"

相关的是对sort的调用,您可以更改它以获得所需的列顺序:sort -h -k2用于人工数字排序,sort -d -k2用于字典顺序,等等。键入man sort
当然,保存脚本csv-arrange.sh,授予执行权限chmod +x csv-arrange.sh并用途:

./csv-arrange.sh myfile.csv > myfile-arranged.csv

免责声明

我建议不要使用awksed来操作CSV文件,除非您已经阅读过RFC 4180并知道您在做什么。有good CLIs用于此目的。

相关问题