파이프로 구분된 파일이 있습니다. 28개의 필드가 있습니다. 마지막 2개 필드를 제거하고 26개 필드만 인쇄해야 합니다.
이것은 마지막 3(26,27,28) 필드입니다.DC||0|
내가 원하는 출력은|DC|
답변1
POSIX 호환 sed의 경우:
sed 's/\([^|]*|\)\{2\}$//'
예를 들어:
$ echo 'foo|DC||0|' | sed 's/\([^|]*|\)\{2\}$//'
foo|DC|
답변2
그리고암소 비슷한 일종의 영양이상한:
awk '{NF=NF-3; NF++}1' FS='|' OFS='|' file
그러면 마지막 세 개의 열이 제거되고 빈 열이 추가됩니다.
바라보다:8개의 강력한 awk 내장 변수 – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
답변3
awk 'BEGIN{FS=OFS="|"} NF>2{NF-=2;$1=$1;print}'
awk 변형의 일부(전부는 아님!)에 대해서는 생략할 수 있습니다 $1=$1
.
행에 3개 미만의 필드가 있는 경우 행이 전혀 인쇄되지 않습니다. 이는 빈 필드로 시작하는 행과 3개 미만의 필드로 시작하는 행 사이에 차이가 있는지 확인하는 유일한 방법입니다.
필드 구분 기호( FS
)가 단일 공백이 아닌 경우 각 공백이 필드를 구분하고 빈 선행 및 후행 필드가 잘리지 않습니다.
이와 같은 줄에는 3개가 아닌 4개의 필드( , , , ) DC||0|
가 있습니다 . = > 로 조인하면 마지막 2개 필드가 제거 됩니다 .DC
<empty>
0
<empty>
DC
<empty>
DC|
|
마찬가지로 와 같은 줄에는 1개가 아닌 3개의 필드( , , ) |DC|
가 있습니다. 마지막 2개 필드를 제거하면 , 즉 빈 줄이 없게 됩니다 .<empty>
DC
<empty>
<empty>
|
답변4
나는 그것을 사용했고 cut -d "|" -f 1-26 <filename>
작동합니다.