我必须将每条记录第三列中的唯一键移至第一列。现在根据这个键,每个记录都有不同的总列数(意味着字段数)
文件内容是
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
来执行此操作是值得的,但对于仅移动两个字段来说,这似乎有点矫枉过正。