나는 긴 문서(이 긴 파일에는 각각 날짜/시간으로 시작하는 여러 단락이 포함되어 있음)를 "grep"(한 줄씩 읽기)하기 위해 while 루프를 사용하고 있습니다.
목적은 특정 문구를 찾고 그 옆에 있는 해당 단락의 날짜/시간을 인쇄하거나 에코하는 것입니다. grep이 문구를 캡처할 수 없을 때 "NULL" 문자를 어떻게 "에코"하거나 "인쇄"합니까? 예를 들어:
파일(test.txt)에 다음 세 개의 단락이 있다고 가정합니다.
20170101,05:00 AM, I am using grep to read certain phrase1 in a long document.
20170102,09:30 AM, I am using grep to read certain phrase2 in a long document.
20170103,05:30 AM, I am using grep to read page in a long document.
"일부 구문"과 날짜/시간을 에코하거나 인쇄하고 "일부 구문을 사용할 수 없는 경우" 출력을 NULL로 바꾸는 방법이므로 출력은 다음과 같습니다.
20170101,05:00 AM,certain phrase1
20170102,09:30 AM,certain phrase2
20170103,05:30 AM,NULL
.
.
.
나는 다음을 사용합니다 :
while read -r line; do
date=$(grep -c "201*")
phrase=$(grep -Eo "certain phrase")
echo $date,$phrase
done < test.txt
답변1
while read -r line; do
date=$(grep -Eo "201.{12}.M," <<< "$line")
phrase=$(grep -Eo "certain phrase" <<< "$line")
echo "${date}${phrase:-NULL}"
done < test.txt
당신은 이 문장을 읽고 있지만 그것에 대해 씨름하지 않습니다. 날짜 부분을 계산하는 대신 첫 번째 grep의 정규식을 조정했습니다 -c
. 퍼즐의 마지막 조각은 $phrase 변수를 사용하는 것입니다.매개변수 확장Null 값을 "NULL"이라는 단어로 바꿉니다.
답변2
나는 다음과 같은 것을 제안 할 것입니다
awk 'BEGIN {OFS=FS=","}
/201/ {
if (match($0,"certain phrase")) {
print $1, $2, substr($0,RSTART,RLENGTH+1)
} else {
print $1, $2, "NULL"
}
}' file
입력 데이터로 테스트합니다.
$ awk 'BEGIN {OFS=FS=","}
> /201/ {
> if (match($0,"certain phrase")) {
> print $1, $2, substr($0,RSTART,RLENGTH+1)
> } else {
> print $1, $2, "NULL"
> }
> }' file
20170101,05:00 AM,certain phrase1
20170102,09:30 AM,certain phrase2
20170103,05:30 AM,NULL
답변3
grep
ping을 실행하는 대신 while
하나의 스크립트 sed
에서 모든 작업을 수행하세요 .
sed 's/\( *[0-9]*,[^,]*,\).*\(certain phrase[^ ]*\).*/\1\2/;t
s/\( *[0-9]*,[^,]*,\).*/\1NULL/' file.txt
sed
한 줄씩 처리가 완료되었으며 각 줄에서 스크립트는 다음을 사용하여 교체를 수행합니다 s
.
첫 번째 부분은 [0-9]*,[^,]*,
날짜 문자열과 일치해야 합니다. 주변 \(\)
으로 둘러싸서\1
\(\)
문구와 공백이 아닌 후행(필요한 경우 조정)을 포함하는 두 번째 항목에도 동일하게 적용됩니다 \2
. 다른 모든 것은 버려졌습니다.
이 교체가 완료되면 t
명령은 우리가 했던 것처럼 스크립트 끝으로 이동합니다. 교환이 불가능할 경우 해당 날짜 이후의 모든 제품은 교환됩니다.NONE
답변4
perl -lne 'print /^((?:.+?,){2})/, /\h\K(certain\h+phrase\d+)/ ? $1 : "NULL"' < test.txt
여기서는 쉼표로 구분된 처음 두 개의 필드를 가져온 다음 "특정 문구"를 찾습니다. 발견되면 이를 사용하고, 그렇지 않으면 "NULL"을 사용하십시오.