linux 根据列值重新排列csv的行

ngynwnxp  于 2022-12-03  发布在  Linux
关注(0)|答案(3)|浏览(152)

我正在尝试根据数据第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

救命啊!

8i9zcol2

8i9zcol21#

$ cat tst.awk
BEGIN { FS="," }
(NR == 1) || f {
    print
    next
}
$1 == $5 {
    print $0 buf
    f = 1
}
{ buf = buf ORS $0 }
$ awk -f tst.awk test.csv
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

上述操作只会将匹配行之前的行保存到内存中。

9njqaruj

9njqaruj2#

你可以这样做:

awk -F ',' '
    !seen[$0]++ {
        if ( $1 == $5 || NR == 1 )
            print
        else
            arr[++n] = $0
    }
    END { for (i = 1; i <= n; i++) print arr[i] }
' input.csv > output.csv

这将缓冲不匹配的行,并在最后输出它们。
输出功率

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
x9ybnkn6

x9ybnkn63#

使用GNU sed

$ sed -Ez 's/^([^\n]*\n)(.*\n)(([[:alpha:]])[^\n]*\4\n)/\1\3\2/woutput.csv' input_file
$ cat output.csv
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

相关问题