문자열에서 부분 문자열의 위치 찾기

문자열에서 부분 문자열의 위치 찾기

"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[@]}"

관련 정보