awk根据引用文件切割原始文件
假设有如下full_data.txt
文件
> cat full_data.txt
ID|NAME|DATE
1199|abc|20171200
1200|def|20171200
1300|zjd|20171204
1301|dfs|20171205
1303|sdf|20171203
1305|adf|20171201
要求从中找出ID为1200
的那些行,显然grep
实现起来不那么友好,会将额外的1199|abc|20171200
带出来,这时候就需要awk
出场了。
创建awk_control.awk
控制文件
#!/bin/awk -f
BEGIN {
_Feed_column=feedcol
_Src_column=srccol
}
NR==FNR {
arr[getValue(_Feed_column)]=1
}
NR>FNR {
FS="|"
if ((arr[getValue(_Src_column)])) {
print $0
}
}
function getValue(column) {
if (column ~ /^[0-9]+$/) {
return $column
}
if (column ~ /^[0-9]+_[0-9]+$/) {
split(column, a, "_")
col1=a[1]
col2=a[2]
return $col1"_"$col2
}
}
END {
}
创建feed.txt
引用文件
> cat feed.txt
1200
1300
执行命令, 得到结果
> awk -F "|" -v feedcol=1 -v srccol=1 -f awk_control.awk feed.txt full_data.txt
1200|def|20171200
1300|zjd|20171204
关键点解析
-
NR
,FNR
-
awk官方说明:
NR: The total number of input records seen so far FNR: The input record number in the current input file
-
当NR==FNR时,是在读取
feed.txt
文件,并将关键列的值塞入array中; -
当NR>FNR时,在读取
full_data.txt
文件,碰到关键列值存在时输出整行print $0
-
-
getValue
函数-
column ~ /^[0-9]+$/
判断是否为单纯的列
-
column ~ /^[0-9]+_[0-9]+$/
判断是否为可并列,按照
_
分割得出index,再把相应的值拼装起来
-
- 原文作者:git9527
- 原文链接:https://zhangsn.me/awk-split-file-by-refer/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。