我正在尝试根据数据第5列中给定的键重新排列csv中的行。我的数据看起来像这样(test.csv):
Col A,Col B,Col C,Col D,Col E
A,Data 1,Category 1,Name 1,C
B,Data 2,Category 2,Name 2,C
C,Data 3,Category 3,Name 3,C
D,Data 4,Category 4,Name 4,C
E,Data 5,Category 5,Name 5,C
F,Data 6,Category 6,Name 6,C
我尝试重新排列它,使第一列中包含键值的行位于顶部(在本例中,键值为C)
所需输出:
Col A,Col B,Col C,Col D,Col E
C,Data 3,Category 3,Name 3,C
A,Data 1,Category 1,Name 1,C
B,Data 2,Category 2,Name 2,C
D,Data 4,Category 4,Name 4,C
E,Data 5,Category 5,Name 5,C
F,Data 6,Category 6,Name 6,C
我已经写了下面的代码,也得到了想要的结果这样做,我生成两个临时文件,只是想知道是否有一个更好的解决方案:
sed 1d test.csv > input.csv
key=`awk -F"," -v 'OFS=,' '{ print $5}' input.csv | uniq`
awk -F"," -v 'OFS=,' '{if($1 == "'$key'") print}' input.csv > temp.csv
cat temp.csv input.csv > temp2.csv
awk '!seen[$0]++' temp2.csv > output.csv
sed -i '1iCol A,Col B,Col C,Col D,Col E' output.csv
救命啊!
3条答案
按热度按时间8i9zcol21#
上述操作只会将匹配行之前的行保存到内存中。
9njqaruj2#
你可以这样做:
这将缓冲不匹配的行,并在最后输出它们。
输出功率
x9ybnkn63#
使用GNU
sed