다음과 같은 데이터가 포함된 파일이 있습니다 listing.txt
.
1
2
3
4
5
그런 다음 다음 명령을 사용하여 파일을 반복하고 각 줄에서 작업을 수행합니다.
IFS=$'\n'
while IFS= read -r inc; do
if [ $inc -eq 1 ]
then
echo "FIRST: $inc"
else
echo "MID: $inc"
fi
done </home/user/listing.txt
하지만 마지막 행인지 확인하는 옵션을 찾을 수 없습니다. 내가 마지막 줄에 있다면 그것을 찾는 가장 좋은 방법은 무엇입니까?
나는 루프에 대해 이야기하는 많은 페이지와 파일에서 마지막 줄을 얻는 것에 대해 이야기하는 페이지를 보았지만 내 루프가 그것이 마지막 줄에 있다는 것을 아는 데 도움이 되는 것은 없습니다.
답변1
총 줄 수라고도 알려진 파일의 마지막 줄 번호를 가져옵니다. 현재 줄 번호를 추적하면서 파일을 반복합니다. 현재 줄 번호가 마지막 줄 번호와 같으면 조치를 취하세요.
#!/bin/bash
file="some-file.txt"
last_line=$(wc -l < $file)
current_line=0
while read -r line; do
current_line=$(($current_line + 1))
if [[ $current_line -ne $last_line ]]; then
# is NOT last line
else
# IS last line
fi
done < $file
답변2
마지막 줄에 있다는 것은 무엇을 의미합니까? 이는 이 행 다음에는 행이 없음을 의미하므로 한 가지 전략은 루프 내부에서 현재 행 뒤에 다른 행이 있는지 확인하는 것입니다. 그렇지 않다면 마지막 행에 있고, 그렇지 않으면 중간에 있습니다.
또 다른 기술은 루프 외부의 변수에 줄을 유지한 다음 루프가 끝나면 변수에 마지막 줄이 포함되는 것입니다. 이는 중간 계산이 부정확해진다는 단점이 있지만 해결 방법을 찾을 수도 있습니다.
답변3
WAF가 설명에서 말한 내용을 반복하려면 이를 사용하여 wc
루프 앞의 행 수를 가져오고 테스트하여 마지막 행을 캡처할 수 있습니다.
IFS=$'\n'
last=$(</home/user/listing.txt wc -l)
while IFS= read -r inc; do
if [ $inc -eq 1 ]
then
echo "FIRST: $inc"
elif [ $inc -eq $last ]
echo "LAST: $inc"
else
echo "MID: $inc"
fi
done </home/user/listing.txt
답변4
한 가지 옵션은 루프의 일부를 "풀어" 다음 행의 상태를 사용하여 현재 행의 처리를 결정할 수 있도록 하는 것입니다.
{
IFS= read -r current
while IFS= read -r next; do
echo "MID: $current"
current=$next
done
echo "LAST: $current"
} </home/user/listing.txt
이와 같은 루프는 줄 수나 파일 내용에 대해 아무것도 알 필요가 없습니다. 특히 이는 데이터 스트림, 즉 다른 프로세스에서 파이프로 연결된 데이터와 함께 작동합니다(아래 예 참조).
첫 번째 줄과 다른 작업을 수행하려면 루프를 약간 펼치십시오.
printf '%s\n' a b c d e | {
IFS= read -r first
echo "FIRST: $first"
IFS= read -r current
while IFS= read -r next; do
echo "MID: $current"
current=$next
done
echo "LAST: $current"
}
산출:
FIRST: a
MID: b
MID: c
MID: d
LAST: e