다른 열의 조건에 따라 한 열의 값을 변경합니다.

다른 열의 조건에 따라 한 열의 값을 변경합니다.

다음과 같이 6개 열이 포함된 일련의 .txt 파일이 있습니다.

-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816  5.3947  40.4102 6 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365  32.0674 36.7889 6 0.1 Frontal-Sup_R

줄 수는 파일마다 다릅니다. 네 번째 열(6)의 조건을 변경하고 싶습니다. 레이블이 "R"이면 1로 변경합니다. 간단한 명령이 있나요?

답변1

$ awk '$6 ~ /_R$/ { $4 = 1 }1' input.txt 
-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816 5.3947 40.4102 1 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365 32.0674 36.7889 1 0.1 Frontal-Sup_R

6열이 로 끝나면 _R$4열을 로 변경합니다 1. 마지막에 있는 awk 스크립트는 1true로 평가되어 awk가 기본 작업인 print.

결과를 stdout으로 인쇄하는 대신 입력 파일을 편집해야 하고 GNU 버전의 awk를 사용하는 경우 gawk inplace라이브러리를 사용할 수 있습니다. 예를 들어

awk -i inplace -v INPLACE_SUFFIX=.bak '$6 ~ /_R$/ { $4 = 1 }1' ./*.txt 

GNU awk가 없으면 각 입력 파일의 출력을 임시 파일에 쓴 다음 이름을 원본 파일로 바꿔야 합니다. 또는 출력 파일을 다른 디렉터리에 쓰고 원본 파일과 수정된 파일을 유지합니다. 디스크 공간이 매우 부족하지 않는 한 파일의 원본 복사본을 덮어쓰는 것은 일반적으로 좋지 않은 생각입니다. 나중에 원본 파일을 삭제할 수 있습니다. , 그러나 백업이나 스냅샷이 없으면 삭제를 취소할 수 없습니다) 예를 들어

$ mkdir out

$ awk -v OUTDIR=./out '
    function basename(f) { sub(".*/", "", f); return f }
    $6 ~ /_R$/ { $4 = 1 }
    { print > OUTDIR "/" basename(FILENAME) }' ./*.txt

$ cat out/input.txt 
-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816 5.3947 40.4102 1 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365 32.0674 36.7889 1 0.1 Frontal-Sup_R

FILENAME현재 처리 중인 파일의 이름을 포함하는 내장 awk 변수입니다. awk에는 내장 함수가 없으므로 awk의 함수만 사용하여 파일 이름에서 경로를 제거하는 basename()간단한 함수를 작성해야 했습니다 . sub()리디렉션은 쉘에서 작동하는 방식과 유사하게 awk에서 작동합니다.

답변2

사용sed

$ sed '/.*_R/s/\(\([^ ]* *\)\{3\}\)[0-9]/\11/' input_file
-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816  5.3947  40.4102 1 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365  32.0674 36.7889 1 0.1 Frontal-Sup_R

답변3

$ awk '/R$/{$4=1}1' file
-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816 5.3947 40.4102 1 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365 32.0674 36.7889 1 0.1 Frontal-Sup_R

$ awk '/R$/{$4=1}1' file | column -t
-44.2584  0.2603   42.7879  6  0.1  Precentral_L
49.3816   5.3947   40.4102  1  0.1  Precentral_R
-22.5897  9.5277   54.8691  6  0.1  Frontal-Sup_L
26.0365   32.0674  36.7889  1  0.1  Frontal-Sup_R

$ awk '/R$/{$4=1}1' file | column -o' ' -t
-44.2584 0.2603  42.7879 6 0.1 Precentral_L
49.3816  5.3947  40.4102 1 0.1 Precentral_R
-22.5897 9.5277  54.8691 6 0.1 Frontal-Sup_L
26.0365  32.0674 36.7889 1 0.1 Frontal-Sup_R

관련 정보