While 루프 - 한 번에 두 줄을 읽습니다.

While 루프 - 한 번에 두 줄을 읽습니다.

로그 파일의 데이터를 구문 분석하려고 합니다.

다음은 데이터 파일입니다.

Data1
Data2
Data3
Data4

내 코드는 다음과 같습니다.

data=$(cat datafile)
echo "$data" | while read line; read line1;
do
    echo "$line and $line1"
done

내가 원하는 출력은 다음과 같습니다.

Data1 and Data2
Data2 and Data3
Data3 and Data4

하지만 내가 얻는 것은 다음과 같습니다.

Data1 and Data2
Data3 and Data4

내가 왜 이런 식으로 행동하는지 이해하지만, 내가 원하는 방식으로 어떻게 해야 할지 모르겠습니다. 혹시 요령 아시는 분 계신가요?

감사해요

답변1

while read텍스트를 처리하기 위해 쉘 루프를 사용하지 마십시오. 여기서 가장 간단한 것은 다음과 같습니다 awk.

awk 'NR > 1 {print prev, "and", $0}; {prev = $0}' < datafile

또는 다음을 사용하여 sed:

sed 'x; 1d; G; s/\n/ and /' < datafile

답변2

얼마나 멀리 갈 것인가?

{ read line
  while read line1
  do
     echo $line and $line1
     line=$line1
  done
 } < datafile 

Data1 and Data2
Data2 and Data3
Data3 and Data4

이해합니다?

답변3

또 다른 동안 읽기 루프 ...

while read -r line; do 
  printf '%s and %s\n' "$line" "$line"
done < data

또는

while read -r line <&3; do 
  read -r line1
  printf '%s and %s\n' "$line" "$line1"
done 3< data < data

또는 bash4+ 매핑 파일

mapfile -t array < data

for i in "${!array[@]}"; do 
  printf '%s and %s\n' "${array[$i]}" "${array[$i]}"
done

답변4

파일을 복제본에 붙여넣고 첫 번째 줄을 삭제했습니다.

$ tail -n+2 datafile | paste datafile -

관련 정보