考虑以下数据:
#!/usr/bin/env bash
cat > example_file.txt <<EOL
group, value, price
1, 3.21, 3.21
1, 3.42, 4.11
1, 3.5, 1.22
2, 4.1, 9.2
2, 4.2, 2.11
EOL
我想将“值”列移到前面:
value, price, group
3.21, 3.21, 1
3.42, 4.11, 1
3.5, 1.22, 1
4.1, 9.2, 2
4.2, 2.11, 2
问题是:列的顺序(甚至列的数量或许多列的名称——除了总是存在的“值”)因文件而异。所以我必须按名称(而不是顺序)选择值列。
我怎样才能做到这一点?
与伟大的米勒 ( http://johnkerl.org/miller/doc ) 很容易
你有
请注意:我已经编辑了我的命令,考虑到问题 CSV 的字段名称中的空格
如果您不介意
value
列被复制,您可以执行以下操作csvtool
:但是据我所知
csvtool
,不会移动(或删除) anamedcol
。如果您找不到专门的 CSV 工具,您可以使用通用语言(例如 Awk 或 Perl)自行开发。想法是在第一行的字段中搜索匹配列的索引,然后按所选顺序对字段进行切片和切块。
例如使用 perl Text::CSV模块,以及这个技巧How to get index of specific element (value) of an array?
我的建议是以下脚本:
让我们调用脚本
reorder.sh
。为了说明脚本的功能,我们假设我们要处理以下文件,它们位于脚本所在的同一目录中。处理一个输入文件:
处理两个输入文件并将必须成为第一列的列的标签更改为
price
:处理目录中的所有文件:
递归处理:
使用
csvtool
它可以通过一个小的 shell-script 包装器来完成:这里的包装器计算出值列在标题中的位置(通过在值之前计算逗号)。然后它使用
csvtool
命令将列重新排列为value, <columns before>, <columns after>
.