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
스크립트는 두 가지 라인을 찾습니다.
- 공백 사이에 있으며 공백이
:
아닌 일부 기호 (0 이상)를 포함해야합니다. - 공백이 아닌 일부 심볼 (다음에 0보다 큼)
=
;
파이프를 통해 전송 된 실행 명령 형식 bash