用awk+for 同时对两列的值进行循环替换输出。

1.txt的数据1|201010|201010|4|5|6|2|3|4|5|6|7|8|3只有一条,如何利用awk+gsub+for循环实现对第2域中间两个值进行任意更改... 1.txt的数据 1|201010|201010|4|5|6|2|3|4|5|6|7|8|3只有一条,如何利用awk+gsub+for循环实现对第2域中间两个值进行任意更改,输出到2.txt中。
实现如下效果图:
1|201010|201010|4|5|6|2|3|4|5|6|7|8|3
1|201110|201011|4|5|6|2|3|4|5|6|7|8|3
1|201210|201012|4|5|6|2|3|4|5|6|7|8|3
。。用for (( i = 0; i < 10000; i++))
do
awk -F'|' -v var=$i '{for(i=1;i <= NF;i++){if(i==2){printf($2+var*100);}else{printf($i)}if(i<NF){printf(FS)}}printf("\n")}' 1.txt >> 2.txt

done可实现对第2列的数序替换,怎么加个嵌套循环,对2列的中间两个数字和3列的最后两个数字同时循环替换呢?
展开
 我来答
LinYWh
2013-02-27 · TA获得超过153个赞
知道答主
回答量:81
采纳率:0%
帮助的人:98.3万
展开全部
还是我,可以稍微的修改就可以了,但是有个缺陷后边的数字会超过12,下面同时给出了一个可以在月份超过12自动变成1然后年份添加1的版本,需要哪个自己拷吧
---------------------------------------------
for (( i = 0; i < 10000; i++))
do
awk -F'|' -v var=$i '{for(i=1;i <= NF;i++){if(i==2){printf($2+var*100);}else{if(i==3){printf($3 + var)}else{printf($i)}}if(i<NF){printf(FS)}}printf("\n")}' 1.txt >> 2.txt

done
----------------------
下面这个版本可以修正第三列月份超过12后自动在年份上添加
--------------------------------------------------------------
for (( i = 0; i < 10000; i++))
do
awk -F'|' -v var=$i '
{
for(i=1;i <= NF;i++){
if(i==2){
printf($2+var*100);
} else {
if(i==3){
f = substr($3, 0, 4);
last = substr($3, 5, 2);
if ((last + var) > 12){
start =int(f + ((last + var) / 12));
end = (last + var) % 12;
}else{
start = f;
end = last + var;
}
printf(start);
printf("%02d", end);
}else{
printf($i)
}
}if(i<NF){
printf(FS)
}
}
printf("\n")
}' 1.txt >> 2.txt
done
-------------------------------
上面awk展开了可以便于理解,可以自行压缩.或者将单引号('')内的awk语句保存到一个文件内用awk调用比如将awk语句存到了test.awk将上面awk语句改成下面即可
awk -F'|' var=$i -f test.awk 1.txt >> 2.txt
更多追问追答
追问
上边短的代码执行有问题  结果是 只第2列的值有变化,第3列没变。  ps:只是随便的值 不是日期。
追答

短代码木有问题阿 我运行了

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式