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

不要使用 shellwhile 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 循环...

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 -

相关内容