我试图自动比较两组包含列式数据的文件。这里有三个主要问题让这个任务变得棘手:
- A组和B组中的列排序不同
- A组使用制表符,而B组使用空格
- A组中有些列为空白,而在B组中会有一个默认值。
我尝试了一些简单的shell脚本来重新排列A组的列次序,例如 awk '{print substr($0, 10, 10) substr($0, 20, 10)}
等等,但是在这组文件中使用制表符意味着列以不一致的字符号码开始。
我认为最简单的解决方法是用空格替换制表符,然后像上面那样使用awk
重新排列数据。我应该如何用一定数量的空格替换制表符,使其到达下一个制表符停止点(假设为8)。
显然,用固定数量的空格替换制表符是行不通的,正如我下面测试的结果一样。
$ echo "A\tB\nA \tB\nA \tB\nA \tB\n" > test
$ cat test
A B
A B
A B
A B
$ cat test | sed 's/\t/ /g'
A B
A B
A B
A B
显然,可以通过编写一些代码来确定制表符所在的位置,并填充适当数量的空格字符以实现对齐,但似乎应该有比我可能忽略的更简单的解决方案。(或者打开vim中的每个文件并使用
:retab
,但一定有更好的选择!)注意:由于某些数据集中存在空白,我无法使用
column
重新排列数据。