다음과 같이 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 스크립트는 1
true로 평가되어 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