
반환된 문자열에 할당된 변수가 있습니다.
ytd_wk=$(cat file.csv | grep $(date +'%Y') | tail -1)
마지막 2자를 부분 문자열로 묶고 싶습니다.
ytd_wk=${ytd_wk:(-2)}
이를 달성하기 위해 한 줄짜리를 사용할 수 있는 방법이 있습니까? 아래에서 시도했지만 bad substitution
오류가 발생했습니다.
ytd_wk=${$(cat file.csv | grep $(date +'%Y') | tail -1):(-2)}
답변1
사용해 보세요:
grep "$(date +'%Y')" file.csv | tail -1 | sed 's/.*\(..$\)/\1/'
다른 프로그램의 출력이나 특정 파일에서 데이터를 가져올 수 있으므로 cat
필요 하지 않습니다 . grep
마지막 방법은 하나의 명령만 사용하기 때문에 더 효율적이며 더 빠르고 시스템 리소스를 덜 소모합니다.
전체 솔루션:
ytd_wk=$(grep "$(date +'%Y')" file.csv | tail -1 | sed 's/.*\(..$\)/\1/')
tail
GNU에서는 생략할 수 있습니다 sed '$!d'
:
grep "$(date +'%Y')" file.csv | sed -r '$!d;s/.*(..$)/\1/'
POSIX:
grep "$(date +'%Y')" file.csv | sed -e '$!d' -e 's/.*\(..$\)/\1/'
답변2
, , 및 기타 제안 사항을 awk
결합하여 사용할 수 있습니다 .cat
grep
sed
tail
awk -v year=$(date +'%Y') '$0 ~ year {line=$0} END {print substr(line,length(line)-1,2)}' file.csv
이것을 단계별로 작성해 보세요.
-v year=$(date +'%Y')
awk
변수를year
현재 연도로 설정합니다 .$0 ~ year { line=$0 }
이는 파일의 각 줄에 차례로 적용됩니다. 현재 줄에 연도와 일치하는 항목이 있으면awk
변수 에 저장합니다.line
END { print substr(line,length(line)-1,2) }
파일 끝에서(마지막 줄을 읽고 처리한 후) 가장 최근에 저장된 줄의 마지막 두 문자를 인쇄합니다. 이전에 성공한 일치 항목이 없으면 빈 줄을 인쇄합니다.
답변3
특히 다음과 같은 경우에는 이것이 더 효율적입니다.파일.csv크고 원하는 라인이 끝에 더 가깝습니다.
ytd_wk="$(tac file.csv | grep -m 1 $(date +'%Y') | grep -o '..$')"
작동 방식: tac
출력파일.csv뒤로 이동하여 마지막 두 문자만 출력하는 grep -m 1
패턴의 첫 번째 인스턴스를 찾습니다 .grep -o