"grep" 출력의 빈 필드를 문자열로 바꿉니다.

"grep" 출력의 빈 필드를 문자열로 바꿉니다.

나는 긴 문서(이 긴 파일에는 각각 날짜/시간으로 시작하는 여러 단락이 포함되어 있음)를 "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

grepping을 실행하는 대신 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"을 사용하십시오.

관련 정보