"schemas.txt" 파일에서 사용자가 입력한 세 번째 필드의 위치를 추출하고 싶습니다.
schemas="schemas.txt"
for i in ${schemas[@]};
do
awk '{for(i=1;i<=NF;i++)if($i=="$3")print i}'
done
무한 루프에 갇힌 이유에 대한 아이디어가 있나요?
편집: 아래에 예를 추가했습니다.
Schemas.txt에서 두 번째 줄은 "캐릭터 키, 몸무게, 나이, 인종, 직업"입니다.
사용자가 세 번째 매개변수로 "age"를 입력했다고 가정해 보겠습니다. 문자열의 네 번째 단어이므로 행을 구문 분석하고 "4"를 반환하고 싶습니다.
답변1
귀하의 의도를 이해한다면 쉘 루프가 필요하지 않다고 생각합니다. 대신 명령줄에서 읽을 파일 이름을 awk에 지정하세요. find -v
명령줄에서 awk 변수를 설정하는 키워드를 전달할 수 있습니다 .
따라서 "age"가 포함된 각 행에 대해 발생하는 필드 번호가 인쇄됩니다.
$ cat schemas.txt
People height weight age race occupation
age is first on this line
$ keyword=age
$ awk -vk="$keyword" '{ for (i = 1 ; i <= NF ; i++) if($i == k) print i }' schemas.txt
4
1
물론 고정 키워드는 를 사용할 수 있는 예시일 뿐이며 awk -vk="$3"
추가 변수는 건너뛸 수 있습니다.
일반적으로 줄 번호를 인쇄하는 것도 유용하고 그렇게 할 수 있습니다 print NR, i
.
여기,
schemas="schemas.txt"
for i in ${schemas[@]};
do
awk '{for(i=1;i<=NF;i++)if($i=="$3")print i}'
done
schemas
만 포함하므로 schemas.txt
루프 i
에서 쉘 변수가 설정됩니다. 그러나 루프에서는 사용되지 않으므로 루프는 실제로 많은 작업을 수행하지 않습니다. awk 스크립트에서 i
쉘 독립적입니다 i
.
awk
기본적으로 표준 입력에서 읽기 때문에 여기에 정지된 것 같습니다. 또한 "$3"
작은따옴표 안의 셸에서는 확장되지 않으므로 awk는 $3
.
여러 파일의 경우 루프가 더 적합합니다.
files=(file1.txt file2.txt)
for file in "${files[@]}"; do
awk '{...}' "$file"
done
하지만 그런 경우에도 모든 파일을 한 번에 awk에 전달할 수 있습니다.
awk '{...}' "${files[@]}"