awk, sed를 사용하여 특정 패턴을 가진 라인의 일부 추출


18

awk / sed 연산자에 관한 질문이 있습니다. 다음 줄 세트가 반복되는 큰 파일이 있습니다.

Expression loweWallrhoPhi :  sum=-6.97168e-09
Expression leftWallrhoPhi :  sum=6.97168e-09
Expression lowerWallPhi :  sum=-5.12623e-12
Expression leftWallPhi :  sum=5.12623e-12
Expression loweWallrhoUSf :  sum=-6.936e-09
Expression leftWallrhoUSf :  sum=6.97169e-09
Expression lowerWallUSf :  sum=-5.1e-12
Expression leftWallUSf :  sum=5.12624e-12

각 경우에 합계 후 값을 별도의 파일로 추출하고 싶습니다. 한 번에 그렇게 할 수 있습니까?

답변:


26

grep 명령으로 :

grep -oP 'sum=\K.*' inpufile > outputfile

grep with -P(perl-regexp) 매개 변수 support \K는 이전에 일치 한 문자를 무시하는 데 사용됩니다.

awk 명령으로 :

awk -F"=" '{print $NF}' inputfile > outputfile

Awk NF는 레코드 / 라인의 총 필드 수를 제공합니다. 따라서 그 마지막 값은 레코드 / 라인의 마지막 필드 번호입니다.

sed 명령으로 :

sed 's/^.*sum=//' inpufile > outputfile

^.*=sum.*줄 시작 ( ^)과 마지막 문자 ( ) 사이의 모든 문자 ( sum=)를 공백 문자로 바꾸십시오 .

결과:

-6.97168e-09
6.97168e-09
-5.12623e-12
5.12623e-12
-6.936e-09
6.97169e-09
-5.1e-12
5.12624e-12

각 값을 별도의 파일로 저장하려면 위 명령을 while 루프에 사용하십시오.

while read line; do
    echo "$line" | grep -oP 'sum=\K.*'     > $(echo "$line" |awk '{print $2}');
   #echo "$line" | awk -F"=" '{print $NF}' > $(echo "$line" |awk '{print $2}');
   #echo "#line" | sed 's/^.*sum=//'       > $(echo "$line" |awk '{print $2}');
done < file

여기에는를 포함 sum=하고 그 이후의 값과 동일하지 않습니다sum=
Anthon

OP는 합산 후의 가치를 원하며 NF에 대한 설명이 끔찍합니다.

1
이 아주 좋은 대답을 완료하려면, 당신은 또한 사용할 수 있습니다 cut: cut -d'=' -f2 file.
fedorqui

이것은 매우 좋은 답변입니다. 나는 그것을 좋아. 감사합니다.
Jaffer Wilson

6

질문을 올바르게 이해하면 이후의 값만 가져 =오고 두 번째 필드 (?)를 기준으로 이러한 값을 별도의 파일에 저장하십시오. 내가 옳다면 다음과 같이 해보십시오.

$ awk -F'[ =]' '{print $6>"file_"$2".txt"}' file

결과:

$ ls -1
  file_leftWallPhi.txt
  file_leftWallUSf.txt
  file_leftWallrhoPhi.txt
  file_leftWallrhoUSf.txt
  file_loweWallrhoPhi.txt
  file_loweWallrhoUSf.txt
  file_lowerWallPhi.txt
  file_lowerWallUSf.txt

$ cat  file_leftWallPhi.txt
  5.12623e-12

@KasiyA GNU awk 4.0.2의 문제를 재현 할 수 없습니다. 내 대답의 명령은 -c옵션 ( awkGNU 확장이 비활성화 된 기존 UNIX의 호환성 모드) 에서도 작동합니다 . 원래 질문이 편집되고 빈 줄이 삭제되어 입력 파일을 업데이트했는지 확인하십시오.
jimmij

1

당신은 그것을 할 수 있습니다 sed

sed -E 's/^.* (\S+)\s*:.*=(\S+)/echo "\2" > "\1".txt/' file | bash

스크립트는 두 가지 라인을 찾습니다.

  1. 공백 사이에 있으며 공백이 :아닌 일부 기호 (0 이상)를 포함해야합니다.
  2. 공백이 아닌 일부 심볼 (다음에 0보다 큼) =;

파이프를 통해 전송 된 실행 명령 형식 bash


훨씬 더 다양한 답변.
duanev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.