Bash 매개변수 $1을 사용하여 이 awk 열 2 선택기를 어떻게 확장합니까?

Bash 매개변수 $1을 사용하여 이 awk 열 2 선택기를 어떻게 확장합니까?

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개의 열이 있습니다.
  • 각 파일의 두 번째 열을 원합니다

pasteAwk와 (셸 파일 글로빙과 함께) 조합을 사용하면 이 작업을 가장 쉽게 수행할 수 있습니다.

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 여기좋은 설명이 있습니다.

관련 정보