- 论坛徽章:
- 0
|
大家好!
最近编写一个Shell脚本,希望能从文本文件中按照ID(第一列)找到记录后,返回对应列的值(列从1开始计算)。
文本文件内容如下:
1234567890 国有企业A 湖南省 长沙市 岳麓区 1992-01-28
0987654321 合资企业B 湖北省 武汉市 东湖区 1993-03-01
1029384756 外资企业C 江苏省 徐州市 中心区 1990-01-01
每个列均由tab分隔(已经在Notepad++中进行了查看)。
但是发现,如果存在中文(如以上数据),那么代码执行会出错,如:
通过1234567890找到第一行,返回企业名称,正确情况应该是:国有企业A,但是返回的却是:
国有企业A 湖南省 长沙市
而且期间的tab键也变成了空格键。
但是如果将其中的中文全部用英文替代,则可以正常返回:guoyouA。
如将以上内容修改为:
1234567890 guoyouA hunan changsha yuelu 1992-01-28
0987654321 heziB hubei wuhan donghu 1993-03-01
1029384756 waiziC jiangsu xuzhou zhongxin 1990-01-01
貌似是中文的问题,不知道如何解决?请高人不惜赐教。谢谢!
以下是相关代码:- 18 #函数说明:从文本文件中(每条记录一行)返回对应下标的值(下标从1开始)的值。
- 19 #参数说明:
- 20 # $1 -- 需要查找字段值的记录;
- 21 # $2 -- 记录字段分隔符;
- 22 # $3 -- 返回值下标(从1开始)
- 23 #举例:splitStr2 "you are the best" " " 2,将返回are。
- 24 #Creator: Colin
- 25 #Date: 2016-07-28
- 26 function splitStr2()
- 27 {
- 28 str_to_split="$1"
- 29 delimiter="$2"
- 30 arrIndex="$3"
- 31
- 32 pointer=`expr index "${str_to_split}" "${delimiter}"`
- 33 counter=1
- 34 while [[ ${pointer} -gt 0 ]]
- 35 do
- 36 if [ ${counter} == ${arrIndex} ]; then
- 37 echo ${str_to_split:0:$[${pointer}-1]}
- 26 function splitStr2()
- 27 {
- 28 str_to_split="$1"
- 29 delimiter="$2"
- 30 arrIndex="$3"
- 31
- 32 pointer=`expr index "${str_to_split}" "${delimiter}"`
- 33 counter=1
- 34 while [[ ${pointer} -gt 0 ]]
- 35 do
- 36 if [ ${counter} == ${arrIndex} ]; then
- 37 echo ${str_to_split:0:$[${pointer}-1]}
- 38 return;
- 39 fi
- 40
- 41 ((counter++))
- 42 str_to_split=${str_to_split:${pointer}}
- 43 pointer=`expr index "${str_to_split}" "${delimiter}"`
- 44 done
- 45
- 46 if [ $counter == $arrIndex ]; then
- 47 echo "${str_to_split}"
- 48 fi
- 49 }
- 50
- 51 #函数说明:从文本文件中(每条记录一行)返回对应下标的值(下标从1开始)的值。
- 52 #参数说明:
- 53 # $1 -- 文本文件路径;
- 54 # $2 -- 查找关键词;
- 55 # $3 -- 记录字段分隔符;
- 56 # $4 -- 返回值下标(从1开始)
- 57 # $5 -- first:表示如果搜索出多行记录,则以第一行记录对应值为准。
- 58 #举例:
- 59 #Creator: Colin
- 60 #Date: 2016-07-28
- 61 function getFieldValueFromLineRecordTxtFile()
- 62 {
- 63 rowNum=`cat $1 | grep $2 | wc -l`
- 64
- 65 if [ ${rowNum} -eq 0 ]; then
- 66 #如果没有找到任何记录;
- 67 echo "No records matched."
- 68 return;
- 69 elif [ ${rowNum} -eq 1 ]; then
- 70 #如果查到了唯一的记录;
- 71 record=`cat $1 | grep $2`
- 72 value=`splitStr2 "${record}" "$3" $4`
- 73 echo "${value}"
- 74 return;
- 75 elif [ ${rowNum} -gt 1 -a $5 = "first" ]; then
- 76 #如果查找到多行记录,并且模式为“以第一行记录为准”;
- 77 record = `cat $1 | grep $2 | head -n 1`
- 78 value = `splitStr2 "${record}" "$3" $4`
- 79 echo "${value}"
- 80 return;
- 81 else
- 82 echo "Found ${rowNum} record(s) and the mode is NOT first!"
- 83 return;
- 84 fi
- 85 }
- 86
- #调用(myTestData_TabSplit.txt 包含了以上展示的文本记录内容)
- 87 getFieldValueFromLineRecordTxtFile "/home/training/fujun/testTabSplitter/myTestData_TabSplit.txt" "1234567890" " " 3 "single"
复制代码 |
|