нужна помощь по сценарию unix для чтения данных из определенной позиции и использования извлеченных в запросе

#shell #unix #awk #sh #ksh

Вопрос:

Входной файл:

 ADSDWETTYT017775227ACG
ADSDWETTYT029635225HCG
ADSDWETTYC018525223JCG
ADSDWETTYC987415221ACG
ADSDWETTCC891235219ACG
ADSDWETTTT074565217ACG
ADSDWETTYT567895213ACG
ADSDWETTYH037535215ACG
ADSDWETTYC051595211ACG
ADSDWETTYT052465209ACG
ADSDWETTYT067595207ACG
ADSDWETTYT077515205ACG
 

нужно проверить позицию 10 в файле, содержащем/начинающемся с T, если она начинается с «T», то мне нужно взять значение из 14 символов из 16.

из приведенного выше файла я ожидаю вывода ниже,

 '5227','5225','5217','5213','5209','5207','5205'
 

этот результат я должен присвоить некоторой константе типа (результат ниже) и должен использоваться в предложении запроса where, как показано ниже,

 result=$(awk '
        BEGIN{
        conf="" };
{       if(substr($0,10,1)=="T"){
        conf=substr($0,16,4);

{NT==1?s="'''"conf:s=s"''','''"conf}
}
}
END {print s"'''"}
' $INPUT_FILE_PATH  

db2 "EXPORT TO ${OUTPUT_FILE}  OF DEL select STATUS FROM TRAN where TN_NR in (${result})"
 

Мне нужна помощь для улучшения команды awk и передачи константы в предложении query where. пожалуйста, помогите.

Ответ №1:

С показанными вами образцами, попытайтесь; пожалуйста, попробуйте следующий awk код.

 awk -v s1="'" 'BEGIN{OFS=", "} substr($0,10,1)=="T"{val=(val?val OFS:"") (s1 substr($0,16,4) s1)} END{print val}'  Input_file
 

Добавление не однострочной формы вышеуказанного кода:

 awk -v s1="'" '
BEGIN{ OFS=", " }
substr($0,10,1)=="T"{
  val=(val?val OFS:"") (s1 substr($0,16,4) s1)
}
END{
  print val
}
'  Input_file
 

Чтобы сохранить вывод этого кода в переменную оболочки, попробуйте выполнить следующие действия:

value=$(awk -v s1="'" 'BEGIN{OFS=", "} substr($0,10,1)=="T"{val=(val?val OFS:"") (s1 substr($0,16,4) s1)} END{print val}' Input_file)

Пояснение: Добавление подробного объяснения приведенного выше кода.

 awk -v s1="'" '             ##Starting awk program from here setting s1 to ' here.
BEGIN{ OFS=", " }           ##Setting OFS as comma space here.
substr($0,10,1)=="T"{       ##Checking condition if 10th character is T then do following.
  val=(val?val OFS:"") (s1 substr($0,16,4) s1) ##Creating val which has values from  current line as per OP requirement.
}
END{                        ##Starting END block of this program from here.
  print val                 ##Printing val here.
}
'  Input_file               ##Mentioning Input_file name here.
 

Ответ №2:

Я бы использовал sed для этого:

 sed -En '/^.{9}T/ s/^.{15}(....).*/1/p' file
 

А затем, чтобы получить точный результат, передайте его в

 ...  | sed "s/.*/'amp;'/" | paste -sd,
 

Комментарии:

1. Вы могли бы добавить ' букву s 1 в первую sed , если бы вы просто изменили разделительные кавычки на этом от ' до " , а затем у вас просто было бы sed | paste вместо sed | sed | paste .

Ответ №3:

Я бы использовал perl awk здесь для его лучших массивов (в частности, для объединения одного в строку). Что-то вроде:

 perl -nE "push @n, substr($_, 15, 4) if /^.{9}T/;
          END { say join(',', map { "'$_'" } @n) }" "$INPUT_FILE_PATH"
 

Комментарии:

1. @jcrshankar Я не уверен, о чем ты спрашиваешь