ログファイルのデータを解析しようとしています。
以下はデータファイルです。
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 -