Bash 将位置文件上的空字段替换为X
我使用bash脚本,我有一个位置文件,如下所示: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(
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请参见上面的
编辑。