파일의 다른 줄을 다른 변수로 읽는 방법은 무엇입니까?

파일의 다른 줄을 다른 변수로 읽는 방법은 무엇입니까?

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

input.txt:

line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar

이 결과를 다음과 같이 변수 에 저장하고 싶습니다 var1.var2var3var4

var1=line1 foo foobar bar
var2=line2 bar

등.

누군가 그것이 어떻게 완료되었는지 말해 줄 수 있습니까? evalfor 루프에서 사용해 보았습니다 . 이것은 작동하지 않는 것 같습니다.

답변1

당신은 이렇게 할 것입니다 :

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배열 인덱싱은 1 대신 0에서 시작하므로(에서 상속됨 ) 첫 번째 줄은 대신 ksh에 있습니다 (비록${line[0]}${line[1]}@Costas가 보여주듯이, 인덱스 1에 값 쓰기를 시작하도록 할 수 있습니다 readarray( 배열은 또한 대부분의 다른 쉘의 경우와 반대입니다).mapfilebash부족한배열) 및 -O 1).

또한보십시오:"IFS=read -r line"을 이해하셨나요?

답변2

이러한 작업에는 배열을 사용하는 것이 좋습니다

mapfile -t -O 1 var <input.txt

그래서 당신은 각 행 등을 얻을 ${var[1]}${var[2]}입니다

답변3

이것은 귀하가 요구하는 것을 엄밀히 말하면 아니지만 귀하의 요구에 적합할 수 있습니다. 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

관련 정보