2014-9-19更新:按4楼提供的方案,已成功解决。感谢各位的关心和热心帮助!
实现代码:
代码: 全选
awk -F',' 'NR==FNR{a[$4]=$2;next}{if(a[$4])$1=a[$4]}1' 001.dic 001.csv >OK.csv
* 从 001.dic 字典文件中,提取2列数据: 第2列的“归类代码”,第4列的“搜索关键字”,然后依次在 CSV 源文件(001.csv)中,把符合指定关键字的行最前面的“未分类”,替换成字典文件中对应的“归类代码”。
* 另外还有一个类似的字典文件 002.dic, 或者还有更多其它字典文件,需要依次同样读取关键字,并对 001.csv 文件进行处理;
# 001.csv CSV表格文件
归类排序,排名,企业名称,国家
未分类,1,沃尔玛,美国
未分类,2,荷兰皇家壳牌石油公司,荷兰
未分类,3,中国石油化工集团公司,中国
未分类,4,中国石油天然气集团公司,中国
+++
# 001.dic 字典文件
代码: 全选
# coding: utf-8
#!DICT_ID="sample-001"
#!DICT_ENTERPRISE="JD(京东商城)"
#!DICT_BRANCH="【上海浦西分拣中心】"
#!DICT_VERSION="0.1"
#!DICT_DATE="2014-08-30"
#!DICT_DESC="sample dictionary for dlist"
#ID,LINE_ID,LINE_NAME,KEY
#0,LINE_9999,未分类,
1,LINE_1001,线路1,中国
2,LINE_1002,线路2,美国
* 最终完成后的 ok.csv 应该是这样的:
主要程序代码如下:归类排序,排名,企业名称,国家
LINE_1002,1,沃尔玛,美国
未分类,2,荷兰皇家壳牌石油公司,荷兰
LINE_1001,3,中国石油化工集团公司,中国
LINE_1001,4,中国石油天然气集团公司,中国
代码: 全选
#!/bin/bash
# coding: utf-8
# filename: dlist.sh
SRC=~/001.csv
SAVETO=~/ok.csv
DIC=~/001.dic
cp $SRC $SAVETO
clear
declare -a DICS=( `ls -1 $HOME/*.dic` )
for a in "${DICS[@]}"; do
echo "* dictionary: $a"
echo
# 查看处理前的原始CSV表格文件 001.csv
echo "原始CSV表格文件: $SRC"
echo " ------------"
cat $SRC
echo " ============"
echo
if [ -z "$a" ]; then
continue;
else
# grep -Ev '^#|^$' 的作用:不显示空白行,还有以#号开头的注释行
grep -Ev '^#|^$' "$a" | awk 'BEGIN { IFS="," ; UNSORT="未分类" ; SORT=$2 ; KEY=$4 } { sed "/$KEY/s/^$UNSORT/$SORT/" }' "$SAVETO"
fi
#echo
done
echo
echo "处理后的文件: $SAVETO"
# 查看处理后的文件 ok.csv
echo "-------------"
cat $SAVETO
echo " ============"
exit 0
请高手指点:应该怎样用 awk实现,或者用其它方式实现?
输出如下:
test@debian:~$ ~/bin/dlist.sh
* dictionary: /home/test/001.dic
原始CSV表格文件: /home/test/001.csv
------------
归类排序,排名,企业名称,国家
未分类,1,沃尔玛,美国
未分类,2,荷兰皇家壳牌石油公司,荷兰
未分类,3,中国石油化工集团公司,中国
未分类,4,中国石油天然气集团公司,中国
============
处理后的文件: /home/test/ok.csv
-------------
归类排序,排名,企业名称,国家
未分类,1,沃尔玛,美国
未分类,2,荷兰皇家壳牌石油公司,荷兰
未分类,3,中国石油化工集团公司,中国
未分类,4,中国石油天然气集团公司,中国
============