루프에서 다른 스크립트의 출력을 다른 파일로 결합

루프에서 다른 스크립트의 출력을 다른 파일로 결합

후속작입니다한 파일의 전체 열을 다른 파일의 단일 값으로 바꾸기결합하다R R에서 Unix로 변수 전달

저는 Unix 스크립트 내에서 여러 스크립트(Perl, Python 및 R)를 실행하고 있으며 이러한 스크립트의 출력을 Unix로 파이프하고 이러한 스크립트로 생성된 다양한 파일의 정보를 병합해야 합니다.

위의 질문을 조합한 작업 코드가 있습니다.

호출된 R 스크립트의 출력은 getenergie.R파일 이름입니다. 이러한 파일 이름이 여러 개 반환되므로 각 파일에 쓰고 이 파일의 11번째 열을 COP1A_report1value라는 다른 파일( )의 값으로 바꿔야 합니다.

RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

#write the one value from COP1A_report1 into column 11 of a file and save as TESTING

value=$(awk -F, 'NR==1{print $2;exit}' ./../COP1A_report1) 
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING

printf "$value ${pdbnames}\n"
done

COP1A_report1내가 필요한 것은 Same 에 저장된 첫 번째 파일 이름과 같은 이름의 파일의 (row $2, line 1)의 값을 열 11에 기록하고 이를 고유한 파일로 저장하고 (line) $pdbnames로 이동하도록 이것을 반복하는 방법입니다 . COP1A_report1$2, 2행)에 저장된 두 번째 파일 이름과 같은 이름의 파일의 열 11에 씁니다 $pdbnames.

가장 현명한 일은 무엇입니까? 내가 상상할 수있는무엇아래 코드와 비슷하지만 구문에 문제가 있습니다. 오류는 발생하지 않고 null 변수만 발생합니다.

어떤 아이디어가 있나요?

counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

value=$(awk -F, 'NR==$counter{print $2;exit}' ./../COP1A_report1) #NR=1 needs to be changed to go through the entire list...
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING$counter
counter=$(echo $counter+1 |bc)
printf "$value ${pdbnames}\n"
done

답변1

awk 스크립트에 전달하려고 하므로 $counter작은따옴표 대신 큰따옴표를 사용해야 합니다. 작은따옴표는 리터럴 문자열에 사용되고, 큰따옴표는 변수가 포함된 문자열에 사용됩니다.

여기에서 큰따옴표를 사용하고 있기 때문에 쉘이 두 번째 인수(있는 경우, 그렇지 않으면 빈 문자열)를 awk 스크립트로 대체하지 않도록 awk 스크립트에서처럼 $2이스케이프 해야 함을 의미합니다 .\$2

value=$(awk -F, "NR==$counter{print \$2;exit}" ./../COP1A_report1

또한 다른 변수를 사용할 때는 인용해야 합니다. 예를 들어 awk ... > "TESTING$counter"- 이 경우 따옴표가 누락되어도 무해하지만 항상 변수에 따옴표를 붙이는 것이 좋습니다.

다시 counter=$(echo "$counter"+1 |bc)말하지만 여기서 인용하지 않는 것은 무해하지만 여전히 나쁜 습관입니다.

마지막으로 설정하면 -v. ~해야 한다awkv="$value"-v v="$value"

counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

    value=$(awk -F, "NR==$counter{print \$2;exit}" ./../COP1A_report1)
    awk -v v="$value" '{$11 = v} 1' "$pdbnames" > "TESTING$counter"
    counter=$(echo "$counter"+1 |bc)
    printf "$value $pdbnames\n"

done

관련 정보