
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
; 또는 전체 스크립트여기두 번째 열의 결합된 결과에 대해 모든 2열 CSV 파일에서 선택할 열(1/2)을 하드 코딩하지 않으면 작동합니다.
#!/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
- 각각 정확히 두 개의 열이 있음
- 그리고 각 파일의 두 번째 열을 원합니다.
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
여기훌륭한 설명과 함께.