Как нарезать массив awk-вывода в bash?

Резюме

В зависимости от того, что bash или же awk версии, которая у меня есть, я получаю разные результаты, когда пытаюсь разрезать массив, содержащий awk выход. В более старых версиях bash и awk «операция среза» (например, ${a[@]:2}) неправильно возвращает массив с одним элементом независимо от того, сколько элементов осталось в нарезанном массиве. Однако это кажется проблемой только при нарезке массивов, которые «захватывают» awk выход.

MWE

  • Вы можете запустить следующее, чтобы воспроизвести проблему:

      bash array_slice.sh text.file
    

    куда array_slice.sh и text.file следующие:

  • array_slice.sh сценарий:

       #!/usr/bin/env bash                                                        
    
       defaultIFS=$IFS                                                            
       IFS=$'n'                                                                  
       t=($(awk '{ printf("%sn", $0) }' "$1"))                                   
       printf "nArray 't' has ${#t[@]} elementsn"                               
       printf "Elements of array 't':n"                                          
       printf "%sn" "${t[@]}"                                                    
    
       t45=( ${t[@]:4} )                                                          
       printf "nArray 't45' has ${#t45[@]} elementsn"                           
       printf "Elements of array 't45':n"                                        
       printf "%sn" "${t45[@]}"      
    
  • text.file :

      some text                                                                   
      some other text                                                             
      this is text too                                                            
      text above is text                                                          
      and text below is text text                                                 
      text text  
    

Вывод для различных платформ

Обратите внимание, как массив t45 имеет только один элемент в выводе Ubuntu 16.04 (предполагается, что их должно быть два) и как он правильно имеет два элемента в выводе Ubuntu 20.04.

  • Ubuntu 16.04 с

    • GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
    • GNU bash, версия 4.3.48 (1) -release (x86_64-pc-linux-gnu) Дает:
      Array 't' has 6 elements
      Elements of array 't':
      some text
      some other text
      this is text too
      text above is text
      and text below is text text
      text text
    
      Array 't45' has 1 elements
      Elements of array 't45':
      and text below is text text text text
    
  • Ubuntu 20.04 с

    • GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
    • GNU bash, версия 5.0.17 (1) -release (x86_64-pc-linux-gnu) Дает:
    Array 't' has 6 elements
    Elements of array 't':
    some text
    some other text
    this is text too
    text above is text
    and text below is text text
    text text
    
    Array 't45' has 2 elements
    Elements of array 't45':
    and text below is text text
    text text
    

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *