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

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

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



답변

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

답변

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

$ 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

답변

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

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

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

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

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