修剪';'并按"分开:"

时间:2015-08-12 02:03:42

标签: linux shell

我需要读取像

这样的文件
#sys_platform:top_agent_id:channel
#              2       :    999     : 999
2:10086:10086;
2:999:999;

如何逐行读取sys_platform和top_agent_id

我写了一个shell,但没有正确

#!/bin/sh
sys_platform=""
top_agent_id=
channel=""

while read p; do 
    echo "line=$p"
    echo $p | awk -F ':' '{print $1 $2 $3}' | read sys_platform top_agent_id channel
    echo "sys_platform:${sys_platform}"
    echo "top_agent_id:${top_agent_id}"
done < ./channellist.txt

结果为:

line=#sys_platform:top_agent_id:channel
sys_platform:
top_agent_id:
line=#              2       :    999     : 999
sys_platform:
top_agent_id:
line=2:10086:10086;
sys_platform:
top_agent_id:
line=2:999:999;
sys_platform:
top_agent_id:

1 个答案:

答案 0 :(得分:1)

awk是你的朋友:

while read p; do 
    sys_platform=`echo $p | awk -F ':' '{print $1}'`
    top_agent_id=`echo $p | awk -F ':' '{print $2}'`
    channel=`echo $p | awk -F ':' '{print $3}' | tr -d ';'`
done < $filename

尽管如此,你可以直接使用bash set builtin:

来完成
while read p; do
  OFS=$IFS
  IFS=':'
  set -f
  splitted=( $p )
  set +f
  sys_platform="${splitted[0]}"
  top_agent_id="${splitted[1]}"
  channel="${splitted[2]}"
  IFS=$OFS
done < $filename

不太可读,但应该更有效率。

相关问题