cut 명령의 필드 옵션에 변수를 전달하는 방법(bash)

cut 명령의 필드 옵션에 변수를 전달하는 방법(bash)

2500개의 열과 3000개의 행이 있는 탭으로 구분된 파일이 있습니다. 헤더를 기준으로 특정 열을 추출하고 싶습니다. 그런데 이 작업은 while 루프에서 수행되므로 매번 다른 열 이름이 선택됩니다.

파일 형식 예:

a     b    c    d    e     f     g    h   
xy    1    2    f    21    4     5    6
qu    9    10   z    50    12    7    8

원하는 출력:

a     b    c    d    g 
xy    1    2    f    5
qu    9    10   z    7

열 번호를 식별한 다음 해당 번호를 변수로 저장하고 -f 아래의 cut에 전달할 생각입니다. 예를 들어 "g" 열을 선택하면 이것이 일곱 번째 필드입니다.

colNum=$(head -1 file.txt | tr '\t' '\n' | cat -n | grep "g" | cut -f 1)
cut -f1,2,3,4,"$colNum" file.txt > new_file.txt

다음 오류가 발생합니다.

cut: fields and positions are numbered from 1
Try 'cut --help' for more information.

답변1

의견에서는 답변이 포함될 필요가 없다는 데 동의했습니다 cut. 저는 GNU Datamash(https://www.gnu.org/software/datamash/)는 이 문제를 우아하게 해결합니다.

문제의 예제 입력을 이라는 파일에 넣은 다음 data.txtdatamash를 사용하여 이를 처리하는 예제를 실행했습니다.

$ datamash -HW cut a,b,c,d,g < data.txt
cut(a)  cut(b)  cut(c)  cut(d)  cut(g)
xy      1       2       f       5
qu      9       10      z       7

헤더에 작업 이름을 추가하지 않으려면 일부 후처리를 통해 약간 정리할 수 있습니다.

$ datamash -HW cut a,b,c,d,g < data.txt | sed 's/cut(\([^[:space:]]*\))/\1/g'
a       b       c       d       g
xy      1       2       f       5
qu      9       10      z       7

답변2

"cut" 명령을 사용하여 탭으로 구분된 파일에서 특정 열을 추출할 수 있습니다. 이렇게 하려면 원하는 열의 열 번호를 결정한 다음 cut 명령에서 "-f" 옵션을 사용하여 열 번호를 지정해야 합니다. 예를 들어 파일에서 "g" 열을 추출하려면 다음 명령을 사용할 수 있습니다.

colNum=$(head -1 file.txt | tr '\t' '\n' | cat -n | grep "g" | cut -f 1)
cut -f1,2,3,4,"$colNum" file.txt > new_file.txt

첫 번째 명령은 원하는 열의 열 번호를 식별합니다.

colNum=$(head -1 file.txt | tr '\t' '\n' | cat -n | grep "g" | cut -f 1)

두 번째 명령은 "cut" 명령을 사용하여 파일에서 지정된 열을 추출합니다.

-f1,2,3,4,"$colNum" file.txt > new_file.txt를 잘라냅니다.

파일에서 필요한 열을 추출하여 new_file.txt에 저장해야 합니다. "cut" 명령에 대한 자세한 내용은 다음 공식 문서를 참조하세요.https://linux.die.net/man/1/cut.

내가 알 수 있는 한, 당신이 보고 있는 오류 메시지는 cut 명령이 필드 인수를 숫자로 예상하지만 변수를 전달하고 있음을 나타냅니다. 이 문제를 해결하려면 변수가 문자열이 아닌 숫자로 해석되도록 cut 명령에서 "$colNum" 주위의 따옴표를 제거하면 됩니다.

수정된 명령은 다음과 같습니다.

cut -f1,2,3,4,$colNum file.txt > new_file.txt

또는 awk 명령을 사용하여 헤더를 기반으로 특정 열을 추출할 수 있습니다.

awk -v col="g" -F'\t' 'NR==1{for(i=1;i<=NF;i++){if($i==col){c=i;break}}} {print $1,$2,$3,$4,$c}' file.txt > new_file.txt

이 명령은 첫 번째 행에서 열 제목 "g"를 찾고, 변수 "c"에 열 번호를 저장하고, new_file.txt에서 처음 4개 열과 "g"라는 열을 인쇄합니다.

관련 정보