我有另一个问题
我有这个数据集
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=\|
,但无济于事
答案 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;与|
并打印
打印