在位置文件上用X替换空字段

时间:2013-12-04 13:38:24

标签: bash shell

我使用bash脚本,我有一个位置文件:

ID(10c)   NAME(10c) CITY(10c) 
ID(10c)   NAME(10c) CITY(10c) 

例如,如果我有

123456    TOTO                   
123457              PARIS

我想要这个输出:

123406    TOTO      XXXXX             
123407    XXXXX     PARIS

我需要实现这个algorythm:

  • id = id(0,4)+ 0 + id(6)
  • 如果名称为空,则用XXXXX替换名称
  • 如果城市空白,请用XXXXX替换城市
  • 将生成的行写入临时文件

我尝试过:

awk 'BEGIN {FIELDWIDTHS="10 10 10"}{$ID = $1;$NAME = $2;$CITY = $3;$ID = substr($ID,1,4)0substr($ID,6);if ($NAME ~ /^\s*$/) $NAME = "XXXXX     ";if ($CITY ~ /^\s*$/) $CITY = "XXXXX     ";PRINT $ID$NAME$CITY}1' $FILEINPUT >> $FILEINPUT.tmp

2 个答案:

答案 0 :(得分:2)

使用awk,您可以说:

awk 'BEGIN {FIELDWIDTHS="10 10 10"}{if ($2 ~ /^\s*$/) $2 = "XXXXX     "; if ($3 ~ /^\s*$/) $3 = "XXXXX     "}1' inputfile

为了您的输入,它会产生:

123456     TOTO       XXXXX     
123457     XXXXX      PARIS     

编辑:根据您的意见,您可以说:

awk 'BEGIN {FIELDWIDTHS="10 10 10"}{if ($2 ~ /^\s*$/) $2 = "XXXXX     "; if ($3 ~ /^\s*$/) $3 = "XXXXX     "; $1=substr($1,1,4)0substr($1,6)}1' OFS='' inputfile

获得理想的结果。

答案 1 :(得分:0)

将行拆分为固定宽度字段并检查字段是否为空

while read ligne  
  do
  ID=$(echo $ligne | cut -c 1-10)
  NAME=$(echo $ligne | cut -c 12-21)
  CITY=$(echo $ligne | cut -c 23-33)

  if [ "$(echo $NAME | tr -d ' ')" == '' ]; then
    # replace NAME
    NAME="xxxxxx"
  fi
done