2013-12-04 1 views
0

Я использую Баш скрипт и у меня есть позиционное файл вроде этого:Заменить Пустое поле Х на позиционный файл

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

для примера, если у меня есть

123456 TOTO     
123457    PARIS 

Я хочу, чтобы этот вывод:

123406 TOTO  XXXXX    
123407 XXXXX  PARIS 

Мне нужно реализовать этот алгоритм:

  • ID = идентификатор (0,4) + 0 + идентификатор (6)
  • если имя пустое заменить имя ХХХХХ
  • если город пуст заменить город ХХХХХ
  • Написать сгенерированную строку в темп файл

То, что я пробовал:

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 
+1

отсутствуют поля, замененные пробелами? (записи фиксированной ширины?) NAME и CITY могут содержать пробелы? –

+0

Да: ID (10char) ИМЯ (10char) CITY (10char) Но если имя или город фидов пусто, вам нужно добавить XXXXX только x5, а не длину поля NAME и CITY. Они могут содержать пустые места –

+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  

EDIT: В соответствии с вашим входом, вы могли бы сказать:

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 

, чтобы получить желаемый результат.

+0

Спасибо! Они не запускаются:/i есть бесконечный цикл ... вы можете увидеть завершенный сценарий по моей теме. –

+1

@ L.Quastana Я не уверен, для чего предназначен ваш сценарий. Вышеуказанная командная строка преобразует данный вход в желаемый результат. – devnull

+0

Хорошо, но в моем поле $ 1 я бы заменил одно значение char на 0 следующим образом: $ 1 = substr ($ 1,1,7) 0substr ($ 1,9), но они не запускаются. –

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 
Смежные вопросы