bash: AWK 코드의 일부를 포함하는 함수

bash: AWK 코드의 일부를 포함하는 함수

내 bash 코드에는 입력 파일과 상호 작용하고 결과를 다른 txt 파일에 추가하는 sed + AWK 코드의 일부가 있습니다. 두 채우기 모두 동일한 bash 스크립트에 의해 생성되고 작업은 다른 변수로 저장됩니다.

#sed removing some lines in input fille "${file}".xvg, defined in the begining of bash script
sed -i '' -e '/^[#@]/d' "${file}".xvg
# AWK measure XMAX and YMAX in the input file
# adding these outputs as two lines in another batch.bfile, which is going to be used for something
awk '
  NR==1{
    max1=$1
    max2=$2
  }
  $1>max1{max1=$1}
  $2>max2{max2=$2}
  END{printf "WORLD XMAX %s\nWORLD YMAX %s\n",max1+0.5,max2+0.5'} "${file}".xvg >> "${tmp}"/batch.bfile

이 두 가지(sed +awk) 작업을 일부 함수(bash 스크립트 시작 부분에 정의됨)로 결합한 다음 스크립트에서 한 줄 명령으로 사용할 수 있습니까(더 복잡한 경우 FOR에 적용됨) 고리)?

내 버전의 예는 다음과 같습니다.

#!/bin/bash


#folder with batch file
home=$PWD
tmp="${home}"/tmp


## define some functions for file processing
bar_xvg_proc () {
##AWK procession of XVG file: only for bar plot;
sed -i '' -e '/^[#@]/d' ${file}
# check XMAX and YMAX for each XVG
awk '
  NR==1{
    max1=$1
    max2=$2
  }
  $1>max1{max1=$1}
  $2>max2{max2=$2}
  END{printf "WORLD XMAX %s\nWORLD YMAX %s\n",max1+0.5,max2+0.5'} ${file} >> "${tmp}"/grace2.bfile

}
###

bar_xvg_proc "${home}"/test.xvg

sed 오류입니다

sed: -i may not be used with stdin

그러나 스크립트에서 함수를 호출하기 전에 test.xvg를 새 변수 $file="${home}"/test.xvg로 정의하면 제대로 작동합니다. 파일에 특정 변수를 할당하지 않고 입력 파일에 직접 이 함수를 사용하려면 어떻게 해야 합니까?

이것은 내 xvg 파일입니다.

# Created by:
#                     :-) GROMACS - gmx cluster, 2019.3 (-:
# 
# Executable:   /usr/local/bin/../Cellar/gromacs/2019.3/bin/gmx
# Data prefix:  /usr/local/bin/../Cellar/gromacs/2019.3
# Working dir:  /Users/gleb/Desktop/DO/unity_or_separation
# Command line:
# gmx cluster is part of G R O M A C S:
#
# Good gRace! Old Maple Actually Chews Slate
#
@    title "Cluster Sizes"
@    xaxis  label "Cluster #"
@    yaxis  label "# Structures"
@TYPE xy
@g0 type bar
       1       94
       2       31
       3       24
       4       24
       5       15
       6        6
       7        6
       8        5
       9        4
      10        4
      11        3
      12        3
      13        3
      14        3
      15        2
      16        2
      17        2
      18        2
      19        1
      20        1
      21        1
      22        1
      23        1
      24        1
      25        1

답변1

함수 내에서 ${file}을 "$1"로 변경하면 원하는 대로 작동합니다.

그런 다음 이것을 변경하는 것을 고려하십시오.

bar_xvg_proc () {
##AWK procession of XVG file: only for bar plot;
sed -i '' -e '/^[#@]/d' "$1"
# check XMAX and YMAX for each XVG
awk '
  NR==1{
    max1=$1
    max2=$2
  }
  $1>max1{max1=$1}
  $2>max2{max2=$2}
  END{printf "WORLD XMAX %s\nWORLD YMAX %s\n",max1+0.5,max2+0.5'} "$1" >> "${tmp}"/grace2.bfile

}

이와 관련하여:

bar_xvg_proc () {
    ##AWK procession of XVG file: only for bar plot;
    # check XMAX and YMAX for each XVG
    awk '
      /^[#@]/ { next }
      (++nr)==1{
        max1=$1
        max2=$2
      }
      $1>max1{max1=$1}
      $2>max2{max2=$2}
      END{printf "WORLD XMAX %s\nWORLD YMAX %s\n",max1+0.5,max2+0.5'} "${@:--}" >> "${tmp}"/grace2.bfile
}

awk를 사용하면 sed가 필요하지 않으며, "${@:--}"이 방법을 사용하면 여러 파일 이름을 전달하거나 스트림을 파이프로 연결하여 작동하는 함수를 가질 수 있습니다. 파일이 존재하지 않으면 awk가 stdin을 사용함을 알려주기 때문입니다.

>>마지막에 대신 사용해야 하는지는 잘 모르겠습니다 >. 함수 외부에서 출력 리디렉션을 수행하고 싶을 수도 있습니다.

관련 정보