ABC,1234.5333,5733.9374,5673.352,352,2.346374,-0.6686874
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
위의 csv 파일에서 마지막 두 필드[ABS(6번째 필드) 또는 ABS(7번째 필드)] 중 하나의 절대값이 >= 10인 모든 레코드를 선택하는 셸 스크립트를 작성해야 합니다.
결과적으로 내 출력은 다음과 같아야 합니다.
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
답변1
암시했듯이 awk를 사용하여 이를 달성할 수 있습니다. 절대값을 얻으려면 자신만의 함수를 정의해야 합니다. 따라서 다음과 같이 사용할 수 있습니다.
awk -F, 'function abs(a) {return a < 0 ? -a : a};(abs($6) >= 10 || abs($7) >= 10)' inputfile.txt
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
답변2
다음과 같은 방법 으로 awk
작업을 수행할 수 있습니다(내장 함수만 사용).
awk -F\, '{if (sqrt($(NF-1)*$(NF-1))>=10 || sqrt($NF*$NF)>=10 ) { print $0}}' input_file
답변3
csv
module 또는 from 을 python
사용하는 등 데이터 및 필터 행을 구문 분석할 수 있는 도구를 사용합니다 .csv
csvsql
csvkit
csvsql -H --query 'select * from file where abs(f) > 10 or abs(g) > 10' file | sed 1d
sed
( 출력 헤더 행을 제거 하기 위해 파이프했습니다 ).
산출:
XYZ,5463.674,93773.683,5734.874,432.0,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564.0,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764.0,-10.67484,5.74764
답변4
Miller( mlr
) 및 해당 filter
하위 명령을 사용하여 크기가 10 이상인 두 번째 필드 또는 마지막 필드가 있는 헤더 없는 CSV 파일에서 모든 레코드를 필터링(추출)합니다.
$ mlr --csv -N filter 'abs($[NF-1]) >= 10 || abs($[NF]) >= 10' file
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764
표시된 대로 awk
현재 NF
레코드의 필드 수입니다. 를 사용하면 $[NF]
마지막 필드의 값을 얻을 수 있고 while은 $[NF-1]
끝에서 두 번째 필드의 값을 얻을 수 있습니다.
데이터에 헤더가 있는 경우 해당 -N
옵션을 제거하고 대신 필드 이름을 사용할 수 있습니다 $[NF]
.
mlr --csv filter 'abs($fieldA) >= 10 || abs($fieldB) >= 10' file