在 UNIX/Linux 中重新排列列

在 UNIX/Linux 中重新排列列

我必须将每条记录第三列中的唯一键移至第一列。现在根据这个键,每个记录都有不同的总列数(意味着字段数)

文件内容是

10,,FH,1834,1010 (newline) 
11,10,BH,9899,1010 (newline)
 21,11,TH,1010,345 (newline)
 22,11,DA,34.65 (newline)
 23,11,DA,76.89 (newline)
 24,11,CC,1010 (newline)
 25,11,CC,1011 (newline) 
13,10,FT,200.68 (newline)

注意:当我粘贴文件时,以某种方式添加(换行符),所有记录都位于同一行。

我在下面写了 awk 逻辑

awk -F',' -v OFS=, '{printf "%s" ,$3 OFS; for(i=1;i<=NF;i++) if(i!=3) printf "%s",$i OFS;printf ORS}' test1.csv

得到这个输出

,H,10,,1834,1010                                                                                                   
,H,11,10,9899,1010                                                                                                 
,H,21,11,1010,345KW                                                                                                
,U,22,11,34.65                                                                                                     
,U,23,11,76.89                                                                                                     
,H,24,11,1010                                                                                                      
,H,25,11,1011                                                                                                      
,T,13,10,200.68 

想要的输出是这样的

FH,10,,1834,1010 (newline)
BH,11,10,9899,1010 (newline)
TH,21,11,1010,345  (newline)
..... ...

问题在于我的命令,第三个字段的一个字符被逗号替换。

答案1

awk -F',' '{print $3 "," $1 "," $2 "," $4 "," $5}' test1.csv

输出是

FH,10,,1834,1010
BH,11,10,9899,1010
TH, 21,11,1010,345 
DA, 22,11,34.65 ,
DA, 23,11,76.89 ,
CC, 24,11,1010 ,
CC, 25,11,1011  ,
FT,13,10,200.68 ,

脚本的这种变化可能会揭示行尾问题

awk -F',' -v OFS=,  '{printf "%s" ,$3 OFS; for(i=1;i<=NF;i++) if(i!=3) printf "%s",$i OFS;print ""}' test1.csv

输出是

FH,10,,1834,1010,
BH,11,10,9899,1010,
TH, 21,11,1010,345 ,
DA, 22,11,34.65 ,
DA, 23,11,76.89 ,
CC, 24,11,1010 ,
CC, 25,11,1011  ,
FT,13,10,200.68 ,

答案2

这更简单,并且它将处理具有任意数量字段的行,而无需在行末尾引入额外的逗号。它还会处理字段少于 3 个的行。

    awk -F, -v OFS=, 'NF > 2 { k=$3; $3=$2; $2=$1; $1=k } { print }' test.csv

重新排列输入字段使得生成输出变得容易,它只是print.

如果有更多值需要移动(例如,关键是第 10 个字段),那么使用循环for来执行此操作是值得的,但对于仅移动两个字段来说,这似乎有点矫枉过正。

相关内容