안녕하세요. 현재 다음 코드를 실행하려고 합니다. YYYY/MM/DD 형식으로 DATE 변수에 문자열이 저장되어 있습니다. cut 명령을 사용하여 연도를 추출하려고 합니다. 파일이나 디렉터리가 아니라는 오류가 발생합니다. 변경하거나 다른 접근 방식을 취할 수 있나요?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
감사해요
답변1
이 cut
유틸리티는 표준 입력 스트림에서 데이터를 읽습니다. 인수로 제공된 문자열에서는 작동하지 않습니다.
따라서 를 사용하려면 cut
표준 입력으로 데이터를 전달해야 합니다.
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
그러나 이는 루프에서 매우 느립니다. 대신 내장된 매개변수 대체를 사용하여 문자열 /
의 첫 번째 매개변수 이후의 모든 항목을 제거하세요 $DATE
.
YYYY=${DATE%%/*}
$DATE
이는 쉘 패턴과 일치하는 가장 긴 접미사 문자열을 제거합니다 /*
. 문자열이 인 경우 2021/10/21
반환됩니다 2021
.
디렉터리에 있는 각 파일의 처음 4자를 가져옵니다(이것이 내 본질입니다).믿다현재 코드에서 이 작업을 수행하려고 합니다. sed
다음과 같이 사용할 수 있습니다.
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
이는 각 파일의 첫 번째 줄을 읽고 줄의 내용을 줄의 처음 4개 문자로 바꾼 다음 종료하기 전에 결과를 터미널에 인쇄합니다.
답변2
쉘이 이를 지원하는 경우 이 목적으로 Here Strings( )를 사용할 수 있습니다 <<<
. 에서 man bash
:
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
귀하의 경우에는 다음을 수행합니다.
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
답변3
좋은 올레를 사용하는 또 다른 방법awk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
-
awk에게 구분 기호를 사용하라고 지시하세요.NR==1
awk에게 각 파일의 첫 번째 줄만 읽도록 지시합니다.{print $1}
구분 기호로 구분된 첫 번째 필드만 인쇄합니다.