내 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을 사용함을 알려주기 때문입니다.
>>
마지막에 대신 사용해야 하는지는 잘 모르겠습니다 >
. 함수 외부에서 출력 리디렉션을 수행하고 싶을 수도 있습니다.