변수 대체

변수 대체

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

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

관련 정보