awk - 递增一列但保持列的其余部分不变

时间:2014-05-19 14:38:57

标签: awk

我有另一个问题

我有这个数据集

1955|1;.;.;.;.;.;.; 1955|1;.;.;.;.;.;.; 1955|1;.;.;.;.;.;.; 1955|2;.;.;.;.;.;.; 1955|2;.;.;.;.;.;.; 1955|2;.;.;.;.;.;.; 1955|3;.;.;.;.;.;.; 1955|3;.;.;.;.;.;.; 1955|3;.;.;.;.;.;.; 1955|4;.;.;.;.;.;.; 1955|4;.;.;.;.;.;.; 1955|4;.;.;.;.;.;.; 1956|1;.;.;.;.;.;.; 1956|1;.;.;.;.;.;.;

以下是我想要的结果:

1955|1;.;.;.;.;.;.; 1955|2;.;.;.;.;.;.; 1955|3;.;.;.;.;.;.; 1955|4;.;.;.;.;.;.; 1955|5;.;.;.;.;.;.; 1955|6;.;.;.;.;.;.; 1955|7;.;.;.;.;.;.; 1955|8;.;.;.;.;.;.; 1955|9;.;.;.;.;.;.; 1955|10;.;.;.;.;.;.; 1955|11;.;.;.;.;.;.; 1955|12;.;.;.;.;.;.; 1956|1;.;.;.;.;.;.; 1956|2;.;.;.;.;.;.;

我正在使用这段代码

for file in /cygdrive/c/work/studies/project/data/trim/"$datenow"/*v3.tsv; 
do
awk -F\| '$1!=l{c=$2}{$2=c++}{l=$1}1' OFS=\| "${file}" > "${file%.*}v4.${file##*.}"
done`

然而,它并没有像我预期的那样工作,因为它只给了我这个

1955|1 1955|2 1955|3 1955|4 1955|5 1955|6 1955|7 1955|8 1955|9 1955|10 1955|11 1955|12 1956|1 1956|2

我做错了什么?

已编辑:我已尝试了所有可能的变体,但它并未向我提供我期待的结果-F\|OFS=\;-F\;OFS=\|,但无济于事

3 个答案:

答案 0 :(得分:1)

您可以尝试此awk

awk -F"[;|]" '{$2=c++%12+1;sub(/;/,"|")}1' OFS=\; file
1955|1;.;.;.;.;.;.;
1955|2;.;.;.;.;.;.;
1955|3;.;.;.;.;.;.;
1955|4;.;.;.;.;.;.;
1955|5;.;.;.;.;.;.;
1955|6;.;.;.;.;.;.;
1955|7;.;.;.;.;.;.;
1955|8;.;.;.;.;.;.;
1955|9;.;.;.;.;.;.;
1955|10;.;.;.;.;.;.;
1955|11;.;.;.;.;.;.;
1955|12;.;.;.;.;.;.;
1956|1;.;.;.;.;.;.;
1956|2;.;.;.;.;.;.;

此版本不会更改任何格式。

awk '{sub(/\|[0-9]+/,"|"c++%12+1)}1' file
1955|1;.;.;.;.;.;.;
1955|2;.;.;.;.;.;.;
1955|3;.;.;.;.;.;.;
1955|4;.;.;.;.;.;.;
1955|5;.;.;.;.;.;.;
1955|6;.;.;.;.;.;.;
1955|7;.;.;.;.;.;.;
1955|8;.;.;.;.;.;.;
1955|9;.;.;.;.;.;.;
1955|10;.;.;.;.;.;.;
1955|11;.;.;.;.;.;.;
1955|12;.;.;.;.;.;.;
1956|1;.;.;.;.;.;.;
1956|2;.;.;.;.;.;.;

它只是替换|

之后的数字

答案 1 :(得分:1)

$ awk 'BEGIN{FS=OFS="|"} $1!=prev{c=0} {sub(/^[^;]+/,++c,$2); prev=$1} 1' file
1955|1;.;.;.;.;.;.;
1955|2;.;.;.;.;.;.;
1955|3;.;.;.;.;.;.;
1955|4;.;.;.;.;.;.;
1955|5;.;.;.;.;.;.;
1955|6;.;.;.;.;.;.;
1955|7;.;.;.;.;.;.;
1955|8;.;.;.;.;.;.;
1955|9;.;.;.;.;.;.;
1955|10;.;.;.;.;.;.;
1955|11;.;.;.;.;.;.;
1955|12;.;.;.;.;.;.;
1956|1;.;.;.;.;.;.;
1956|2;.;.;.;.;.;.;

答案 2 :(得分:0)

一个非常相似但同样有效的答案:

awk -F"[;|]" 'OFS=";" {$2=a[$1]+++1;sub(/;/,"|"); print}' file

<强>解释

定义两个可能的字段分隔符;和|

  

-F “[; |]”

定义单个输出字段分隔符;

  

OFS = “;”

将第二个字段(管道之后)的内容替换为第一个字段索引的数组,该字段随每次出现而递增

  

awk -F“[; |]”'OFS =“;” {$ 2 = [$ 1] +++ 1

替换第一个FS;与|

并打印

  

打印