BASH 라인 읽기($line 및 아래 라인 출력)

BASH 라인 읽기($line 및 아래 라인 출력)

이 부분을 읽는 데 문제가 있습니다. 내 파일에는 n 줄이 있습니다. 동일한 루프 단계에서 아래 행의 값을 어떻게 저장할 수 있습니까? 누군가 나를 도와줄 수 있을까요?

감사해요

세부 사항:

$ cat testfile.txt
1
2
3
4
5
6
7
8
9
10
while read line; do echo "Current line read: $line"; echo "Line below: `grep -A 1 $line testfile.txt`"; done < testfile.txt
Current line read: 1
Line below: 1
2
--
10
Current line read: 2
Line below: 2
3
Current line read: 3
Line below: 3
4
Current line read: 4
Line below: 4
5
Current line read: 5
Line below: 5
6
Current line read: 6
Line below: 6
7
Current line read: 7
Line below: 7
8
Current line read: 8
Line below: 8
9
Current line read: 9
Line below: 9
10
Current line read: 10
Line below: 10
#

grep -A 1 6 testfile.txt 6 7

grep -A 1 6 testfile.txt | grep -v 6 7

답변1

솔루션의 문제점은 grep각 행을 호출한다는 것입니다. 실제로 grep은 각 줄을 구문 분석합니다. 따라서 n 줄이 포함된 파일의 경우 해당 줄은 n^2 번 구문 분석되며 로딩은 grep상당히 비용이 많이 드는 호출입니다.

이 예에서는 다음과 같이 단일 라인 버퍼를 사용합니다 PrevLine.

#!/bin/bash
CurLine=''
isFirstLine=true
while IFS='' read -r LineBelow; do
  if $isFirstLine; then
    echo "This is the first line, so no previous."
  else
    echo "Current line read: ${CurLine}"
    echo "Line below: ${LineBelow}"
  fi
  CurLine="${LineBelow}"
  isFirstLine=false
done <"$1"

실제로 trueto를 할당하는 것은 문자열 할당이며, (if 조건에서) 문자열을 실행하는 명령이라고 isFirstLine방금 언급했습니다 . $isFirstLine및는 bash에 내장되어 있으므로 속도에 큰 영향을 주지 않고 직접 사용할 수 있지만 가독성이 크게 향상됩니다 true.false

마지막 줄은 $1입력 파일 이름으로 언급되므로 호출은 다음과 같습니다.

./test.sh inputfile.txt

관련 정보