후속작입니다한 파일의 전체 열을 다른 파일의 단일 값으로 바꾸기결합하다R R에서 Unix로 변수 전달
저는 Unix 스크립트 내에서 여러 스크립트(Perl, Python 및 R)를 실행하고 있으며 이러한 스크립트의 출력을 Unix로 파이프하고 이러한 스크립트로 생성된 다양한 파일의 정보를 병합해야 합니다.
위의 질문을 조합한 작업 코드가 있습니다.
호출된 R 스크립트의 출력은 getenergie.R
파일 이름입니다. 이러한 파일 이름이 여러 개 반환되므로 각 파일에 쓰고 이 파일의 11번째 열을 COP1A_report1
value라는 다른 파일( )의 값으로 바꿔야 합니다.
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
. ~해야 한다awk
v="$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