파일의 다른 줄을 다른 변수로 읽는 방법?


14

텍스트 파일의 다른 줄을 다른 변수로 읽으려고합니다. 예를 들어

input.txt:

line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar

나는이 결과 변수에 저장하려면 var1, var2, var3var4그러한

var1=line1 foo foobar bar
var2=line2 bar

등등.

누군가 어떻게하는지 말해 줄 수 있습니까? evalfor 루프에서 사용하려고했습니다 . 작동하지 않는 것 같습니다.



3
이것은 나쁜 접근 방식입니다. 기본적으로 설정 변수에 대한 유일한 이유가하는 것이기 때문에 그들과 함께 일을 할, 특히 도구의 광대 한 수 있기 때문에 설계 파일에서 텍스트의 모든 라인과 함께 일을하는이 (awk는, Sed의, grep, cut, 등. 등.), 해야 일을 하는 것이 훨씬 낫습니다 . 쉘 스크립트에서 미세 관리하지 마십시오. 작업 수행을위한 도구 조정.
와일드 카드

답변:


20

당신은 할 것입니다 :

unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt

또는:

{ line1=$(line) && line2=$(line); } < input.txt

( line대부분의 내장 기능은 별로 효율적이지 않으며 대부분의 쉘은 명령 대체를 구현하기 위해 분기해야합니다. line더 이상 표준 명령이 아닙니다).

루프를 사용하려면

unset -v line1 line2 line3
for var in line1 line2 line3; do
  IFS= read -r "$var" || break
done < input.txt

또는 변수 이름을 다음과 같이 자동으로 정의합니다 line<++n>.

n=1; while IFS= read -r "line$n"; do
  n=$((n + 1))
done < input.txt

bash배열 변수와 배열에 readarray행을 읽을 수 있는 내장 변수 를 지원합니다 .

readarray -t line < input.txt

참고 대부분의 다른 조개는 달리, 그러나 것을 bash배열 인덱스는 (상속 0이 아닌 1부터 시작 ksh첫 번째 줄에있을 것입니다, 그래서) ${line[0]},하지 ${line[1]}(비록 @Costas 표시된 것처럼 , 당신은 할 수 있습니다 readarray(일명 mapfile) indice의 값을 쓰기 시작 1 (와 bash배열은 대부분의 다른 쉘의 희소 배열 과 반대 입니다 -O 1)).

참조 : "=이 -r 라인을 읽을 IFS를"이해?


12

그런 작업에 배열을 사용하도록 제안했습니다.

mapfile -t -O 1 var <input.txt

그래서 당신은 각 행이있을 것이다 ${var[1]}, ${var[2]}등등


이 하나의 라이너는 매우 잘 작동합니다. 나를 위해 문제를 해결했습니다.
Matt Zabojnik

0

이것은 엄격하게 요청한 것이 아니지만 필요에 따라 작동 할 수 있습니다. Awk로 데이터를 직렬화 할 수 있습니다. $ 1이 유효한 변수 이름이 아닌 경우이 오류가 발생합니다.

awk '
function quote(str,   d, m, x, y, z) {
  d = "\47"; m = split(str, x, d)
  for (y in x) z = z d x[y] (y < m ? d "\\" d : d)
  return z
}
{
  print $1 "=" quote($0)
}
' input.txt > /tmp/input.sh
. /tmp/input.sh

결과:

$ echo "$line1"
line1 foo foobar bar

이것은 정말 이상한 코드입니다! awk를 사용하여 전체 입력 파일을 bash 스크립트로 바꾸고 소스 코드를 작성하는 것으로 보입니다. quote ()이 무엇을하고 있는지 모호한 생각이 있습니다. 더 설명적인 변수 이름이 도움이 될 것입니다. 좀 더 설명해 주시겠습니까?
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.