awk
(또는 gawk
)을 사용 하여 일부 데이터를 변환 하고 출력을 다시 인쇄하기 전에 입력 필드 중 하나를 삭제하고 싶습니다.
내가 달성하고 싶은 것은 다음과 같습니다.
~ $ echo 'field1,field2,field3' | awk -F, '{transform($1); delete($2); print $0;}'
new_field1,field3
난 그냥에 빈 문자열을 할당 할 수 없습니다 $2
에 그 리드가 있기 때문에 new_field1,,field3
(두 개의 쉼표를 참고).
원하는 필드 만 명시 적으로 인쇄 할 수 있지만 3보다 훨씬 많은 필드가 있고 끝에 선택적 필드가 있기 때문에 매우 우아하지는 않습니다 (여기에 표시되지 않음). 그것이 내가 선호하는 이유 print $0
입니다. 먼저 일부 필드를 제거하면됩니다.
어떤 생각?
awk에서 필드를 삭제하는 것은 매우 어렵습니다. 매우 간단한 (그리고 종종 필요한) 작업 인 것처럼 보이지만,해야 할 것보다 어렵습니다.
추가 구분 기호가 인쇄되지 않도록 awk에서 필드를 완전히 삭제하는 방법이 있습니까?를 참조하십시오 . 이를위한 좋은 방법은 Stack Overflow에서
rmcol()
@ghoti의 대답에 함수를 복사 했으므로 여기 U & L에 사본이 있습니다.
function rmcol(col, i) {
for (i=col; i<NF; i++) {
$i=$(i+1)
}
NF--
}
현재 입력 행에서 지정된 열을 삭제하고 NF
일치 시킬 필드 카운터 ( )를 감소시킵니다 .
나는 당신의 transform()
함수가 무엇을하는지 전혀 모르기 때문에 그것을 복제하려고 시도하지도 않을 것입니다. 그러나 여기 rmcol()
에 awk
한 줄로 사용하는 예가 있습니다 .
$ echo 'field1,field2,field3' | awk -F, -v OFS=, '
function rmcol(col, i) {
for (i=col; i<NF; i++) {
$i=$(i+1)
}
NF--
}
{ rmcol(2); print; }
'
field1,field3
BTW, 입력 줄에서 여러 필드를 삭제해야하는 경우 역순으로 삭제하는 것이 가장 좋습니다 / 가장 쉽습니다. 즉, 가장 높은 번호의 필드를 먼저 삭제하십시오 . 왜? 높은 번호의 필드는 낮은 번호의 필드를 삭제할 때마다 번호가 다시 매겨지기 때문에 어떤 필드 번호가 어떤 필드에 속하는지 추적하기가 매우 어렵습니다.
BTW, delete()
in awk
은 입력 행에서 필드를 삭제하는 것이 아니라 배열의 요소를 삭제하기위한 것입니다. 당신은 할 수 split()
각 입력 (에 라인 FS
배열로) 및 2 차 배열 요소를 삭제,하지만 당신은 작성해야 할 것 join()
쉼표 (또는와 배열을 인쇄하는 기능을 OFS
각 필드를 분리).
모든 배열 awk
이 연관 배열 이기 때문에 그렇게하는 것조차 예상보다 더 복잡 할 것입니다 (즉, 숫자 인덱스 가 아님 ). 따라서 배열 요소 3+를 요소 2+로 자동으로 이동 delete(array[2])
하지 않습니다 . 입력 필드에 delete()
대해 수행하는 배열에 대해 거의 동일한 작업을 수행하려면 자체 래퍼 함수를 작성해야 rmcol()
합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다