이것은 사소한 것일 수 있지만 tcl 스크립트를 사용하여 파일의 첫 번째 줄을 인쇄하는 것과 같은 간단한 목적으로 awk를 사용하는 데 문제가 있습니다. tcl 스크립트에서 다음 명령을 사용했습니다.
awk '/manager/ {print $4}' sourcefile.txt
하지만 오류가 발생합니다.
extra characters after close braces
소스 파일.txt:
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000
검색 문자열이 포함된 행의 특정 열을 인쇄하고 싶습니다. 여기서 검색 문자열은 "manager"이고 원하는 출력은 네 번째 열이므로 원하는 출력은 다음과 같습니다.
45000
50000
47000
awk 명령은 터미널에서 잘 실행되지만 파일에 넣은 다음 파일을 실행하면 오류가 표시됩니다.
해결책을 찾았습니다. 답변 해주셔서 감사합니다!
한 가지 더 의심스러운 점은 "var" 변수에 "manager" 값을 저장한다고 가정해 보겠습니다. 검색에 이 변수를 사용하고 싶습니다. 사용할 수 있습니까?
awk {/$var/ {print $4}} sourcefile.txt
방법을 찾을 수 없습니다. 위의 명령은 나에게 결과를 제공하지 않습니다.
답변1
작은따옴표를 중괄호로 바꾸십시오.
awk {/manager/ {print $4}} sourcefile.txt
작은따옴표 문자(')는 Tcl 언어에서 특별한 의미가 없습니다. 이건 그냥 평범한 캐릭터입니다. Tcl에서 단어는 공백으로 분할되므로 공백이 있는 리터럴이나 문자열은 인용되어야 합니다. 문자열을 인용하는 방법에는 두 가지가 있습니다. 중괄호와 따옴표가 있습니다.
중괄호로 인용하면 대체가 수행되지 않습니다. 포함된 중괄호는 백슬래시를 사용하여 이스케이프할 수 있지만 백슬래시는 문자열의 일부라는 점에 유의하세요.
큰따옴표로 묶으면 명령, 백슬래시 및 변수 대체가 처리됩니다.
답변2
이는 tcl에서 간단하게 수행할 수 있습니다.
set fi [ open "file.txt" ]
set lines [split [read $fi] "\n"]
close $fi
foreach line $lines {
if { [ regexp {^.+manager.+$} $line manager ] } {
regexp {[0-9]+$} $manager account
puts $account
}
}
또는 awk와 더 유사
foreach line $lines {
set la [ split $line ]
if { [ lindex $la 1 ] eq {manager} } {
puts [ lindex $la 3 ]
}
}
목록 인덱싱은 0부터 시작하고 awk는 $4
tcl입니다.[lindex $la 3]