Search code examples
awkcsh

How to cut field in awk


I want to write script file to cut field and then use it to compare the field then print ex: My input file

ADC1/asf/sd/df_adc1/125125
AED1/asf/sd/df_aed1/asfk
ASQ2/asf/df_asq2/aks
ABX5/df_abx5/asf/sd/sdgqw

Output file: The last field will print from beginning to the field have same the first but not capitalized. I will compare the first field and then find the word and print from begin to the word I had compare.

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

I had use awk to split :

awk '{split($1,a,"/"); {print $1, a[1]}}' input > output

and the output like that

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

but i dont know how to compare to make last field


Solution

  • With your shown samples, please try following awk program.

    awk '
    BEGIN{ FS=OFS="/" }
    {
      val=""
      for(i=1;i<=NF;i++){
        if(i>1 && index(tolower($i),tolower($1))){
          print $0" "$1" "val OFS $i
        }
        val=(val?val OFS:"")$i
      }
    }
    '  Input_file
    

    Explanation: Adding detailed explanation for above solution.

    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 && 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.