2018-05-11 又见awk——指定列匹配则合并两个文件指定行

awk 'NR==FNR{a[$2]=$3FS$4;next}{if($2 in a)print $0,a[$2]}' b.txt a.txt

判断 a.txt 文件中第二个字段的内容存在于 b.txt 文件中的第二个字段的话就输出该行,并把 b.txt 文件中的两个日期内容添加在该行后

跟我们之前第一个版本的awk生成报表逻辑是一样的

用sed写这个,实在是太蛋疼了!坚决不这么干。会写 sed '40s/hello/bye' greet.txt这种按行号指定替换内容就行了。

sed -rn '/^[^0-9]/H;/^[0-9]/{G;/(.*)( .*)( .*)\n\n.*\2( [^ ]*)( [^ ]*).*/s//\1\2\3\4\5/p}' b.txt a.txt

[解析]
sed操作两个文件难度很大吧。今天学习到一个新的思路,两个文件的差别还比较明显,就是一个是数字开头,一个是英文开头,先把 b.txt 文本处理全部追加到 hold space 里,因为是英文字母开头的所以很好区分开。然后匹配到数字开头的行,那就是 a.txt 文件了,G 把 hold space 里的内容追加到该行后,然后开始匹配,因为我们要的是第二个字段,所以通过小括号把第二个字段取到,匹配 \n\n 后是否能匹配到 \2 的内容,这里为什么是 \n\n 的写法呢?因为我们之前用的是 H 追加,hold space 里当时是空的,追加去后第一行会是一个空行,所以这里写两个换行符来匹配,如果匹配成功就执行替换,把我们要的标记出的内容替换成一行,然后打印。

你可能感兴趣的:(2018-05-11 又见awk——指定列匹配则合并两个文件指定行)