Как вырезать поле в awk

#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. Я сравню первое поле, а затем найду слово и напечатаю от начала до слова, которое я сравнивал