Bash 입력 매개변수를 사용하여 Bash 스크립트를 함수로 만들려고 하는데 AWK 구문이 문제를 일으키고 있습니다. 원본 AWK 코드
http://stackoverflow.com/a/19602188/54964
awk -F "\"*,\"*" '{print $2}' textfile.csv
Bash 매개변수가 포함된 의사코드$1
file=$(awk -v colN="$1" -F "\"*,\"*" '{print $"${colN}"}' "${input}")
# http://stackoverflow.com/a/19602188/54964
# http://stackoverflow.com/a/19075707/54964
문제는 부품에 있습니다 print $"${colN}"
.
현재 출력은 두 번째 열을 캡처할 수 없으며 전체 행 등을 차지합니다.
-0.21,-0.245
-0.205,-0.22
print $colN
의 값에 관계없이 항상 첫 번째 열을 사용하므로 갖는 것은 올바르지 않습니다 $1
.
bash code.bash 2
나는 그것을 사용 사례 또는 완전한 스크립트라고 부르기 위해 ; 를 사용합니다.여기두 번째 열에 대한 조인 결과를 얻기 위해 선택하려는 열(1/2)을 두 열 CSV 파일 모두에 하드코딩하지 않은 경우에 작동합니다.
#!/bin/bash
ids=(101 118 201)
dir="/home/masi/Documents/CSV/"
index=0
for id in "${ids[@]}";
do
input=$(echo "${dir}P${id}C1.csv")
# take second column of the file here
file=$(awk -v colN="$1" -F "\"*,\"*" '{print $colN}' "${input}") # http://stackoverflow.com/a/19602188/54964 # http://stackoverflow.com/a/19075707/54964
Ecgs[${index}]="${file}"
index=$index+1
done
여러 열 입력 1.csv 2.csv 3.csv
-0.21,-0.245
-0.205,-0.22
원하는 출력
101,118,201
-0.245,-0.245,-0.245
-0.22,-0.22,-0.22
운영 체제: 데비안 8.5
배쉬 4.30
답변1
예제 입력에는 모든 파일의 첫 번째 및 두 번째 필드에 동일한 값이 있으며(모든 파일에 대해 동일한 값) 이는 정확한 사용 사례를 이해하는 데 실제로 도움이 되지 않습니다. 결국, 동일한 값을 세 번 원하고 입력 파일의 모든 필드에서 이를 얻을 수 있다면 다른 두 파일을 확인할 필요조차 없습니다. 다음을 사용할 수 있습니다.
cut -d, -f2 input.csv | paste -d, - - -
물론 이는 실제 입력에는 적용되지 않고 예제 입력에만 적용됩니다. (이러한 유형의 문제에 대한 예제 입력/출력을 개선하려는 노력의 일환으로많은.)
가정을 하면:
- 항상 정확히 세 개의 입력 파일이 있습니다.
- 부르다
input1.csv
,input2.csv
,input3.csv
- 각 열에는 정확히 2개의 열이 있습니다.
- 각 파일의 두 번째 열을 원합니다
paste
Awk와 (셸 파일 글로빙과 함께) 조합을 사용하면 이 작업을 가장 쉽게 수행할 수 있습니다.
paste -d, input[123].csv | awk -F, -v OFS=, '{print $2, $4, $6}'
이러한 가정이 틀렸다면 잘못된 입력/출력 예제를 비난하십시오. ;)
답변2
명시된 대로 귀하의 질문에 대답하려면
$ cat file
a,b,c
d,e,f
g,h,i
j,k,l
그리고 간단한 테스트 스크립트
$ cat col.bash
#!/bin/bash
awk -F, -vcol="$1" '{print $col}' file
$col
필수 열이 실제로 참조되는지 확인할 수 있습니다 .
$ ./col.bash 2
b
e
h
k
귀하의 경우 이것이 작동하지 않으면 다른 요인이 작용합니다. 어쨌든 여러 파일에서 열을 추출하는 더 쉬운 방법이 있습니다.
답변3
이 상황에서 Bash와 AWK를 사용하는 것은 매우 어려울 것입니다. 여기에 제안된 솔루션으로는 문제를 해결할 수 없습니다. "
/ /...문제가 많이 발생하게 되므로 '
여기서 도구가 필요합니다.
gawk
스레드에서 설명한 대로 사용ECG Bash 선택 도구.
# https://codereview.stackexchange.com/a/146370/122105
#!/usr/bin/gawk -f
# https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
@include "join.awk"
BEGIN {
FS = "\"*,\"*";
last_row = 0;
}
BEGINFILE {
rows[0][ARGIND] = gensub(".*P([0-9]*)C.*", "\\1", "g", FILENAME);
}
{
rows[FNR][ARGIND] = $col;
if (FNR > last_row) { last_row = FNR; }
}
END {
for (r = 0; r <= last_row; r++) {
print join(rows[r], 1, ARGC - 1, ",");
}
}
전체 답변을 읽어주세요200_success
여기좋은 설명이 있습니다.