我有一个像这样的 csv 文件:
5/05/2017;03;07;30;35;43;01;03
9/05/2017;08;12;16;22;26;06;07
12/05/2017;02;20;28;29;44;03;09
16/05/2017;08;11;15;20;30;03;08
19/05/2017;09;11;12;19;30;04;09
23/05/2017;08;15;25;27;42;01;04
26/05/2017;05;07;26;36;39;02;10
...
Run Code Online (Sandbox Code Playgroud)
也就是说,一个日期,加上一系列数字,后跟;
。
我需要在第一个位置删除那个日期,并按顺序从 1004 开始......像这样:
1004;03;07;30;35;43;01;03
1005;08;12;16;22;26;06;07
1006;02;20;28;29;44;03;09
1007;08;11;15;20;30;03;08
1008;09;11;12;19;30;04;09
1009;08;15;25;27;42;01;04
1010;05;07;26;36;39;02;10
...
Run Code Online (Sandbox Code Playgroud)
我可以使用这个删除日期:
cut -f 2-8 -d';' 2.txt | xargs -I{}
Run Code Online (Sandbox Code Playgroud)
但是如何按顺序添加一个数字来替换日期?
awk解决方法:
awk -F';' 'BEGIN{ i=1004 }{ $1=i++ }1' OFS=';' file
Run Code Online (Sandbox Code Playgroud)
-F';'
- 输入字段分隔符
i=1004
- 起始增量
输出:
1004;03;07;30;35;43;01;03
1005;08;12;16;22;26;06;07
1006;02;20;28;29;44;03;09
1007;08;11;15;20;30;03;08
1008;09;11;12;19;30;04;09
1009;08;15;25;27;42;01;04
1010;05;07;26;36;39;02;10
Run Code Online (Sandbox Code Playgroud)
或者您可以i
从“外部”传递变量:
awk -F';' '{ $1=i++ }1' i=1004 OFS=';' file
Run Code Online (Sandbox Code Playgroud)
与awk
:
awk -v cnt=1004 '{ sub("^[^;]+", cnt++) } 1' file.csv
Run Code Online (Sandbox Code Playgroud)带壳:
cnt=1004
while read -r line; do
printf '%d;%s\n' $cnt "${line#*;}"
let cnt++
done <file.csv
Run Code Online (Sandbox Code Playgroud)使用jot
, paste
, 和一个可以处理<(...)
重定向的 shell :
paste -d\; <(jot $(wc -l <file.csv) 1004) <(cut -d\; -f2- file.csv)
Run Code Online (Sandbox Code Playgroud)使用 Vim:
:let cnt=1004 | g/^/ s/^[^;]\+/\=cnt/ | let cnt+=1
Run Code Online (Sandbox Code Playgroud)使用 Perl:
perl -F\; -lpe 'BEGIN{ $cnt=1004 } $F[0]=$cnt++; $_=join ";", @F' file.csv
Run Code Online (Sandbox Code Playgroud)