반환된 문자열에 변수가 할당되어 있습니다.
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