如何用AWK实现2个文件的合并:如
a文件PSID=84703200001|PSNUM=864703200001|PSIDFLAG=0|SRVPRVTYPE=1|PSID=84703200002|PSNUM...
a文件
PSID=84703200001|PSNUM=864703200001|PSIDFLAG=0|SRVPRVTYPE=1|
PSID=84703200002|PSNUM=864703200002|PSIDFLAG=0|SRVPRVTYPE=1|
PSID=84703200003|PSNUM=864703200003|PSIDFLAG=0|SRVPRVTYPE=1|
b文件
PSID=84703200001|TCSISRVKEYDESC1=彩铃|
PSID=84703200003|TCSISRVKEYDESC1=彩铃|
最后的结果以a文件为主,显示结果为
PSID=84703200000|PSNUM=864703200000|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
PSID=84703200001|PSNUM=864703200001|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
PSID=84703200002|PSNUM=864703200002|PSIDFLAG=0|SRVPRVTYPE=1||
PSID=84703200003|PSNUM=864703200003|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
以a表为主关联b表 展开
PSID=84703200001|PSNUM=864703200001|PSIDFLAG=0|SRVPRVTYPE=1|
PSID=84703200002|PSNUM=864703200002|PSIDFLAG=0|SRVPRVTYPE=1|
PSID=84703200003|PSNUM=864703200003|PSIDFLAG=0|SRVPRVTYPE=1|
b文件
PSID=84703200001|TCSISRVKEYDESC1=彩铃|
PSID=84703200003|TCSISRVKEYDESC1=彩铃|
最后的结果以a文件为主,显示结果为
PSID=84703200000|PSNUM=864703200000|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
PSID=84703200001|PSNUM=864703200001|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
PSID=84703200002|PSNUM=864703200002|PSIDFLAG=0|SRVPRVTYPE=1||
PSID=84703200003|PSNUM=864703200003|PSIDFLAG=0|SRVPRVTYPE=1|TCSISRVKEYDESC1=彩铃|
以a表为主关联b表 展开
3个回答
展开全部
实现你的需求其实不需要awk,使用 join 反而更简单;
join -t'|' -a1 a b
一个命令搞定;简单解释一下,join可以连接有相同字段的文件,-t 指定分隔符为 ‘|’,-a1 意思是左连接 a 文件;
使用这条命令得到的结果会和你要求的格式有一点小小的出入,表现在'|'的数量上,修正如下:
join -t'|' -a1 a b | sed -e 's/||/|/g' | sed '/TCSI/!s/|$/&|/g'
会得到你要的结果
使用我提供的命令有一个前提:
PSID这个字段是排过序的,看你提供的样例应该是满足的;
join -t'|' -a1 a b
一个命令搞定;简单解释一下,join可以连接有相同字段的文件,-t 指定分隔符为 ‘|’,-a1 意思是左连接 a 文件;
使用这条命令得到的结果会和你要求的格式有一点小小的出入,表现在'|'的数量上,修正如下:
join -t'|' -a1 a b | sed -e 's/||/|/g' | sed '/TCSI/!s/|$/&|/g'
会得到你要的结果
使用我提供的命令有一个前提:
PSID这个字段是排过序的,看你提供的样例应该是满足的;
展开全部
1)新建 awk 脚本 awk_merge.sh,内容如下:
#!/usr/bin/awk -f
BEGIN {FS="|"}
NR==FNR {
a[FNR]=$1;
b[FNR]=$2;
c=FNR;
}
NR>FNR {
isFound = 0;
for(i=1; i<=c; i++)
if($1 == a[i])
{
print($0b[i]"|");
isFound = 1;
break;
}
if (isFound == 0)
print($0);
}
2)赋予脚本可执行权限:
chmod +x awk_merge.sh
3)执行脚本:
./awk_merge.sh b.txt a.txt
注:以a文件为主,把a文件放在后面一个参数。
#!/usr/bin/awk -f
BEGIN {FS="|"}
NR==FNR {
a[FNR]=$1;
b[FNR]=$2;
c=FNR;
}
NR>FNR {
isFound = 0;
for(i=1; i<=c; i++)
if($1 == a[i])
{
print($0b[i]"|");
isFound = 1;
break;
}
if (isFound == 0)
print($0);
}
2)赋予脚本可执行权限:
chmod +x awk_merge.sh
3)执行脚本:
./awk_merge.sh b.txt a.txt
注:以a文件为主,把a文件放在后面一个参数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给你个shell脚本
while read -r astr
do
FIND_FLAG=0
FLAGSTR=`echo $astr|cut -d "|" -f1`
#echo $FLAGSTR
while read bstr
do
BFLAGSTR=`echo $bstr|cut -d "|" -f1`
if [ $FLAGSTR = $BFLAGSTR ]
then
BLEFT=`echo $bstr|cut -d "|" -f2-`
echo $astr$BLEFT
FIND_FLAG=1
break
fi
done < b.txt
if [ $FIND_FLAG = 0 ]
then
echo $astr
fi
done < a.txt
while read -r astr
do
FIND_FLAG=0
FLAGSTR=`echo $astr|cut -d "|" -f1`
#echo $FLAGSTR
while read bstr
do
BFLAGSTR=`echo $bstr|cut -d "|" -f1`
if [ $FLAGSTR = $BFLAGSTR ]
then
BLEFT=`echo $bstr|cut -d "|" -f2-`
echo $astr$BLEFT
FIND_FLAG=1
break
fi
done < b.txt
if [ $FIND_FLAG = 0 ]
then
echo $astr
fi
done < a.txt
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询