변수 대체

변수 대체

반환된 문자열에 변수가 할당되어 있습니다.

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/')

tailGNU 생략을 사용할 수 있습니다 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함께 사용할 수 있습니다 .catgrepsedtail

awk -v year=$(date +'%Y') '$0 ~ year {line=$0} END {print substr(line,length(line)-1,2)}' file.csv

이 단계를 단계별로 작성하세요.

  • -v year=$(date +'%Y')awkyear변수를 올해로 설정
  • $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

관련 정보