Bash 将位置文件上的空字段替换为X

Bash 将位置文件上的空字段替换为X,bash,shell,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 我需要实现这个算法: id=id(

我使用bash脚本,我有一个位置文件,如下所示:

ID(10c)   NAME(10c) CITY(10c) 
ID(10c)   NAME(10c) CITY(10c) 
例如,如果我有

123456    TOTO                   
123457              PARIS
我想要这个输出:

123406    TOTO      XXXXX             
123407    XXXXX     PARIS
我需要实现这个算法:

  • 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

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

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

使用
awk
,您可以说:

awk 'BEGIN {FIELDWIDTHS="10 10 10"}{if ($2 ~ /^\s*$/) $2 = "XXXXX     "; if ($3 ~ /^\s*$/) $3 = "XXXXX     "}1' inputfile
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
对于您的输入,它将产生:

123456     TOTO       XXXXX     
123457     XXXXX      PARIS     

编辑:根据您的输入,您可以说:

awk 'BEGIN {FIELDWIDTHS="10 10 10"}{if ($2 ~ /^\s*$/) $2 = "XXXXX     "; if ($3 ~ /^\s*$/) $3 = "XXXXX     "}1' inputfile
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

以获得所需的结果。

是否用空格替换缺少的字段?(固定宽度记录?)。它们可能包含空白(我已经更新了我的主题)谢谢!他们没有运行:/i我有一个无限循环。。。您可以在我的主题上看到conplete脚本。@L.Quastana我不确定您的脚本的用途。上面的命令行会将给定的输入转换为所需的输出。好的,但是在我的$1字段中,我想用0值替换一个字符,比如:$1=substr($1,1,7)0substr($1,9),但它们不会运行。@L.Quastana请更新您的问题。由于缺少格式选项,很难阅读评论。@L.Quastana请参见上面的
编辑