bash에서 구분 된 텍스트 파일을 명령 인수로 구문 분석


10

텍스트 파일이 다음과 같이 분할되어 있습니다.

field1,field2,field3 
xield1,xield2,xield3 
dield1,dield2,dield3 
gield1,gield2,gield3

이 각 열은 프로그램의 매개 변수가되며 각 줄마다 프로그램을 호출하고 싶습니다.

나는 루프를 원했다.

for $i in file
    command $field2 -x $field3 -PN -$field1 >> output
done

bash에서 이와 같은 것을 달성하는 가장 좋은 방법은 무엇입니까?


필드 수는 일정합니까?
Joseph R.

@JosephR. 예, 그들은 항상 3

답변:


7
while IFS=, read xx yy zz;do
    echo $xx $yy $zz
done < input_file

필드 수가 일정한 경우 작동합니다. 대신 echo명령 을 사용하십시오.


고마워, 나는 이것을 시도했지만 첫 번째 줄에서만 작동하는 것 같습니다. 명령이 성공하자마자 다음 명령을 시도하지 않고, 실패하면 다음 명령을 시도합니다.
Dean

성공 또는 실패는 무엇을 의미합니까? 당신의 명령은 무엇입니까?
coffeMug

나는 그가 읽고있는 명령이 "읽기"명령이 나오기 전에 표준 입력을 읽고 있다고 생각할 것이다.
plugwash

4

내장 기능 while과 함께 사용해야합니다 read.

while IFS= read -r line;do
    fields=($(printf "%s" "$line"|cut -d',' --output-delimiter=' ' -f1-))
    command "${fields[1]}" -x "${fields[2]}" ... # ${fields[1]} is field 2
done < your_file_here

작동 원리

  • cut문은 선을 취하고로 지정된 구분 기호에 분할 -d.
  • --output-delimiter분리 문자 cut우리가 배열에 다른 필드를 넣을 수 있습니다, 그래서 여기에 우리가 공간을 선택, 선택한 필드를 표시하는 데 사용됩니다 fields.
  • 마지막으로, 우리는 모든 필드 (필드 1에서 끝까지)를 원합니다 -f1-.
  • 이제 배열 변수에 저장된 다른 필드가 fields, 당신이 구문을 사용하여 원하는 특정 필드에 액세스 할 수 있습니다 덜 배열 인덱싱하기 때문에 원하는 실제 필드 수보다 한 것은 배쉬에서 제로입니다.${field[number]}number

노트

  • 필드에 공백이 있으면 실패합니다.

일정한 수의 필드

대신 1_CR의 답변 과 비슷한 것을 할 수 있습니다 .

while IFS= read -r line;do
    IFS=, read -r field1 field2 field3 <<-EOI
    $line
    EOI
    command "$field2" -x "$field3" ... 
done < your_file_here

위의 내용은 시끄러운 것처럼 보이지만 Bash뿐만 아니라 POSIX 호환 쉘에서 작동해야합니다.


내가 문제가있는 파일을 읽지 않고 행을 열로 나눕니다.
Dean

@Dean 그래, 미안 나는주의를 기울이지 않았다. 지금 작업 중입니다.
Joseph R.

@Dean 업데이트 된 답변을 참조하십시오. 곧 설명을 추가하겠습니다.
Joseph R.

@JosephR., 호출 IFS에서 적절한 값 으로 설정하여 분리를위한 외부 도구 사용을 피할 수 있습니다read
iruvar

@ 1_CR 감사합니다. 나는 단지 그것에
Joseph R.

1

적절하게 설정 read하여 각 행을 배열로 분할 할 수 있습니다 .,IFS

while IFS=, read -r -a input; do
 printf "%s\n" "${input[0]}" "${input[1]}"
done < input.txt

따라서 위의 예에서 0부터 시작하는 색인을 사용하여 각 배열 요소에 액세스 할 수 있습니다.


1

awk원 라이너는 당신이 원하는 것을 할 것입니다 :

awk -F, '{cmd="echo " $2 " -x " $3 " -PN " $1 ">> output";  system(cmd)}' f.txt

교체 echo명령과 함께하고 f.txt당신이 반복하고자하는 파일과 함께.

간단한 설명 : 구분 기호로 -F,설정 ,됩니다. cmd명령을 빌드하고 명령을 system(cmd)호출합니다.


1

gnu sed도 사용할 수 있습니다.

sed infile -e 's!^\([^,]*\),\([^,]*\),\([^,]*\)$!command \1 -x \2 -PN \3!e' >> output

s 명령에 e 옵션 사용을 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.