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; 또는 전체 스크립트여기두 번째 열의 결합된 결과에 대해 모든 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
  • 각각 정확히 두 개의 열이 있음
  • 그리고 각 파일의 두 번째 열을 원합니다.

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 여기훌륭한 설명과 함께.

관련 정보