#awk #csh
Вопрос:
Я хочу написать файл сценария для вырезания поля, а затем использовать его для сравнения поля, а затем распечатать пример: Мой входной файл
ADC1/asf/sd/df_adc1/125125
AED1/asf/sd/df_aed1/asfk
ASQ2/asf/df_asq2/aks
ABX5/df_abx5/asf/sd/sdgqw
Выходной файл: последнее поле будет печататься от начала до поля, совпадающего с первым, но не с прописной буквы. Я сравню первое поле, а затем найду слово и напечатаю от начала до слова, которое я сравнивал.
ADC1/asf/sd/df_adc1/125125 ADC1 ADC1/asf/sd/df_adc1
AED1/asf/sd/sf_aed1/asfk AED1 AED1/asf/sd/sf_aed1
ASQ2/asf/dg_asq2/aks ASQ2 ASQ2/asf/dg_asq2
ABX5/da_abx5/asf/sd/sdgqw ABX5 ABX5/da_abx5
Мне пришлось использовать awk для разделения :
awk '{split($1,a,"/"); {print $1, a[1]}}' input > output
и вот такой результат
ADC1/asf/sd/df_adc1/125125 ADC1
AED1/asf/sd/df_aed1/asfk AED1
ASQ2/asf/df_asq2/aks ASQ2
ABX5/df_abx5/asf/sd/sdgqw ABX5
но я не знаю, как сравнить, чтобы сделать последнее поле
Комментарии:
1. Добро пожаловать в SO. Пожалуйста, добавьте свои усилия в виде кода, который настоятельно рекомендуется на SO, спасибо.
2. Спасибо за редактирование, похоже, в вашей последней строке
ABX5/da_abx5/asf/sd/sdgqw ABX5 ABX5/da_abx5
есть опечатка, разве это не должно быть так:ABX5/df_abx5/asf/sd/sdgqw ABX5 ABX5/df_abx5/asf/sd/
?3. никакой опечатки, мне просто нужна печать, например, если ABX5, мне понадобится печать от начала до…. abx5
Ответ №1:
С показанными вами образцами, пожалуйста, попробуйте следующую awk
программу.
awk '
BEGIN{ FS=OFS="/" }
{
val=""
for(i=1;i<=NF;i ){
if(i>1 amp;amp; index(tolower($i),tolower($1))){
print $0" "$1" "val OFS $i
}
val=(val?val OFS:"")$i
}
}
' Input_file
Пояснение: Добавление подробного объяснения приведенного выше решения.
awk ' ##Starting awk program from here.
BEGIN{ FS=OFS="/" } ##Setting FS and OFS as / here.
{
val="" ##Nullifying val here.
for(i=1;i<=NF;i ){ ##Traversing through all fields here.
if(i>1 amp;amp; index(tolower($i),tolower($1))){ ##Checking if field is greater than 1 and $1 is found in $i(current field) in case-insensitive mode then do following.
print $0" "$1" "val OFS $i ##Printing current line first field val OFS and current field.
}
val=(val?val OFS:"")$i ##Creating val which has val and current field value in it.
}
}
' Input_file ##Mentioning Input_file name here.
Комментарии:
1. Спасибо за ваш ответ, но последнее поле это не совсем то, что мне нужно. Если первое поле ABX5, мне просто нужно распечатать от начала до поля abx5. То же самое с другой строкой
2. @masifq, хорошо, вы имеете в виду, что, когда строка начинается с
ABX5
этого момента, вам нужно распечатать 2 поля, а если нет, то печатать значения до последнего появления/
? Пожалуйста, подтвердите один раз.3. вся строка, которая мне нужна, печатается с начала до не заглавной буквы той же строки, например: ABX5 я буду печатать с начала до ….abx5, ADC1 я буду печатать с начала до … adc1, ASQ2 я буду печатать с начала до … asq2,
4. @masifq, мне жаль, что все еще не совсем ясно. Так вы хотите сказать, что хотите проверить, начинается ли строка с заглавной буквы? Просто упомяните, насколько последняя строка в вашем выводе отличается от остальных строк, с логикой того, как вы их получаете.
5. Я сравню первое поле, а затем найду слово и напечатаю от начала до слова, которое я сравнивал