파일 이름과 일치하는 줄 사이에 공백을 추가하는 방법은 무엇입니까? 많은 파일에 대해 "grep"을 실행하면 grep이 파일 이름과 줄 사이의 구분 기호로 "-" 또는 ":"(숫자 또는 문자열을 의미함)를 사용하는 것처럼 보입니다. 따라서 줄에 따라 구분 기호가 첫 번째 문자에 연결될 수도 있고 분리될 수도 있습니다. 후속 작업에서 어떻게 이것이 일관되게 이루어질 수 있습니까? 연속 작업에서 "awk"를 사용하여 동일한 열의 숫자를 가져오고 싶습니다. 세부사항은 다음과 같습니다.
첫 번째 열이 오른쪽 정렬된 5자리 숫자처럼 보이도록 파일을 작성할 수 있습니다. 루프의 종료 조건에 따라 루프의 마지막 줄이 다를 수 있습니다. 다음 줄 "...optimization bla bla"를 사용하여 루프의 마지막 줄을 찾습니다.
파일 케이스 1
9969 2020-11-23T14:20:09 6.7433e-02 1.0544e-03 - 2.1166e-03 C 1.2973e-01 - 1.4468e+00 C
...optimization unsuccessful.
다른 파일의 사례 2
10072 2020-11-23T14:30:48 6.7384e-02 1.0569e-03 - 2.1148e-03 C 1.2968e-01 - 1.4539e+00 C
...optimization unsuccessful.
저는 "awk"를 사용하여 8번째 값인 8달러를 얻고 싶습니다. 그럼 난 달려
grep "optimization un" */log.txt -B 1
출력은 다음과 같습니다
NN14/log.txt- 5015 2020-11-21T00:13:37 7.4772e-02 9.5215e-04 - 2.2506e-03 C 1.3664e-01 - 1.2459e+00 C
NN14/log.txt:...optimization unsuccessful. 392.1 min.
NN18/log.txt-10080 2020-11-23T22:41:12 6.5363e-02 9.1362e-04 - 2.4192e-03 C 1.2775e-01 - 1.3058e+00 C
NN18/log.txt:...optimization unsuccessful. 1517.2 min.
그런 다음 다음을 사용하여 번호를 얻고 싶습니다.
grep "optimization un" */log.txt -B 1 | awk '/T/ {print $8}'
그러면 결과는 이렇게 된다
C
1.2775e-01
그래서 "NN14/log.txt-5015"와 "NN18/log.txt-10080"을 공백 유무에 관계없이 동일한 형식으로 변경하고 싶습니다. 어떻게 하나요? 아니면 다른 방법이 있나요? 탭에 -T를 사용해 보았으나, 파일명 측이 아닌 줄 측에 구분 기호가 추가되어 작동하지 않습니다.
답변1
메타: 댓글에 설명이 너무 많지만 질문에 대한 답변이 없습니다.
"먼저 파일 중간에 있는 일련 번호의 마지막 줄을 찾아야 합니다"라는 말이 무슨 뜻인지 모르겠습니다. 표시하는 명령은 "optimization un" 문자열을 포함하는 행(표시하는 데이터에 문자 "T"도 포함하는 경우) 앞의 행을 선택하며, 이 행에는 실제로 숫자 중 하나 이상이 포함됩니다. 연속적일 수 있지만 선택은 연속된 숫자나 짝수와 관련이 없습니다. 선택은 문자열과 문자에만 기반합니다.
여러 파일을 greping하고 */log.txt
있으므로기본grep 출력은 파일 이름과 대시 또는 콜론으로 각 줄을 시작합니다. (이것은 "숫자 또는 문자열"과 아무 관련이 없습니다. 행에 콜론을 사용합니다.성냥줄의 정규식 및 대시앞으로또는뒤쪽에-B
옵션(사용한) 또는 .)로 인해 포함된 일치 항목입니다 -A
. 그러나 콜론이나 대시 모두 공백이 아니기 때문에 행이 때때로 사용자와 같은 공백으로 시작하는 경우 이는 awk
공백을 사용한 기본 필드 구문 분석에 영향을 미칩니다. ( awk
필드 구문 분석할 수 있는변경되었지만 귀하의 데이터 형식에 더 잘 맞는 변경 사항이 없습니다. )
그러나 선택한 행과 필드는 awk
파일 이름에 의존하거나 파일 이름을 포함하지 않으므로소홀히 하다작동하는 파일 이름입니다. 파일 이름을 생략 합니다 grep -h
. 이것을 시도해 보세요 grep -h -B1 "optimization un" */log.txt
(이와 같은 옵션은 -h -B1
정규식/패턴 및 파일 이름 앞에 와야 하지만 GNU grep을 사용하면 확장자로 뒤에 넣을 수 있습니다). 그러면 다음과 같은 데이터가 표시됩니다.
5015 2020-11-21T00:13:37 7.4772e-02 9.5215e-04 - 2.2506e-03 C 1.3664e-01 - 1.2459e+00 C
...optimization unsuccessful. 392.1 min.
10080 2020-11-23T22:41:12 6.5363e-02 9.1362e-04 - 2.4192e-03 C 1.2775e-01 - 1.3058e+00 C
...optimization unsuccessful. 1517.2 min.
(IME에는 블록을 구분하는 줄도 있어야 하지만 --
표시하지 않습니다.) (그러나 있는 경우 건너뛰므로 awk
중요하지 않습니다.)
이제 원래 파이프를 통과하면 | awk '/T/{print $8}'
제대로 작동할 것입니다.
grep
하지만 내가 말했듯이 (그리고 그 형식도) 전혀 필요하지 않습니다. 다음을 수행하십시오.
awk '/optimization un/{print x} {x=$8}' */log.txt
이들 중 하나가 문제를 해결해야 하지만 그 중 어느 것도 질문한 질문에 대답하지 않습니다(파일 이름과 일치하는 줄 사이에 공백 넣기). 따라서 스택 정책에 따라 이것은 유효한 대답이 아니므로 제거해야 합니다.
답변2
":" 또는 "-"와 같은 구분 기호로 줄을 구분할 수 없는 경우 awk에서 필드 수를 계산할 수 있습니다.
grep "optimization un" */amp-log.txt -B 1 | awk '{if(NF==11) {print $8} else if(NF==12) {print $9} }'
그런 다음 다음을 얻습니다.
1.3725e-01
1.3664e-01
1.2968e-01
1.2775e-01
에도 불구하고"
NN12/log.txt- 5014 2020-11-20T23:34:02 7.5423e-02 8.5699e-04 - 2.2759e-03 C 1.3725e-01 - 1.1654e+00 C
NN16/amp-log.txt-10072 2020-11-23T14:30:48 6.7384e-02 1.0569e-03 - 2.1148e-03 C 1.2968e-01 - 1.4539e+00 C