#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. Вы могли бы добавить
'
букву s1
в первую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 Я не уверен, о чем ты спрашиваешь