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.