Program Tip

쉘 (awk, sed 등)을 사용하여 파일에서 처음 두 열을 제거하는 방법

programtip 2020. 11. 6. 19:07
반응형

쉘 (awk, sed 등)을 사용하여 파일에서 처음 두 열을 제거하는 방법


각 줄에 많은 줄이있는 파일이 있습니다. 빈 ""으로 구분 된 많은 열 (필드)이 있습니다. 각 줄의 열 수가 다릅니다. 처음 두 열을 제거하는 방법은 무엇입니까?


다음과 cut같이 할 수 있습니다 .

cut -d " " -f 3- input_filename > output_filename

설명:

  • cut: cut 명령을 호출합니다.
  • -d " ": 구분자로 단일 공백 cut사용 ( 기본적으로 TAB 사용)
  • -f: 유지할 필드 지정
  • 3-: 필드 3으로 시작하는 모든 필드
  • input_filename:이 파일을 입력으로 사용
  • > output_filename:이 파일에 출력을 씁니다.

또는 다음과 같이 할 수 있습니다 awk.

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename

설명:

  • awk: awk 명령 호출
  • $1=""; $2="";: 필드 1과 2를 빈 문자열로 설정
  • sub(...);: 필드 1 및 2는 여전히 ""로 구분되므로 출력 필드를 정리하십시오.
  • print: 수정 된 줄 인쇄
  • input_filename > output_filename: 같은 상기와.

비교적 이해하기 쉬운 Awk로 수행하는 한 가지 방법이 있습니다.

awk '{print substr($0, index($0, $3))}'

이것은 패턴이없는 간단한 awk 명령이므로 {}모든 입력 행에 대해 내부 작업 이 실행됩니다.

동작은 세 번째 필드의 위치로 시작하는 부분 문자열을 간단히 인쇄하는 것입니다.

  • $0: 전체 입력 라인
  • $3: 세 번째 필드
  • index(in, find): find문자열 의 위치를 ​​반환합니다.in
  • substr(string, start): 인덱스에서 시작하는 하위 문자열을 반환합니다. start

쉼표와 같은 다른 구분 기호를 사용하려면 -F 옵션과 함께 지정할 수 있습니다.

awk -F"," '{print substr($0, index($0, $3))}'

에서 작업 전에 패턴을 지정하여 입력 줄의 하위 집합에 대해이 작업을 수행 할 수도 있습니다 {}. 패턴과 일치하는 행만 조치가 실행됩니다.

awk 'pattern{print substr($0, index($0, $3))}'

패턴은 다음과 같은 것일 수 있습니다.

  • /abcdef/: 정규식 사용, 기본적으로 $ 0에서 작동합니다.
  • $1 ~ /abcdef/: 특정 필드에서 작동합니다.
  • $1 == blabla: 문자열 비교 사용
  • NR > 1: 레코드 / 라인 번호 사용
  • NF > 0: 필드 / 열 번호 사용

질문을 게시 해 주셔서 감사합니다. 저에게 도움이 된 스크립트도 추가하고 싶습니다.

awk '{ $1=""; print $0 }' file

awk '{$1=$2="";$0=$0;$1=$1}1'

입력

a b c d

산출

c d

다음을 사용할 수 있습니다 sed.

sed 's/^[^ ][^ ]* [^ ][^ ]* //'

이것은 하나 이상의 비 공백, 공백, 또 다른 하나 이상의 비 공백 세트 및 다른 공백으로 시작하는 행을 찾고 일치 된 자료 (일명 처음 두 필드)를 삭제합니다. 표기법 [^ ][^ ]*은 동등하지만 더 명시적인 [^ ]\{1,\}표기법 보다 약간 짧고 두 번째 표기법은 GNU에 문제가 sed발생할 수 있습니다 ( --posix옵션으로 사용 하는 경우 에도 GNU가이 sed를 망칠 수는 없습니다). OTOH, 반복 할 문자 클래스가 더 복잡한 경우 번호가 매겨진 표기법이 간결함을 위해 승리합니다. '공백 또는 탭'을 구분 기호로 처리하거나 '다중 공백'또는 '다중 공백 또는 탭'을 처리하도록 확장하는 것은 쉽습니다. 첫 번째 필드 앞의 선택적 선행 공백 (또는 탭)을 처리하도록 수정할 수도 있습니다.

For awk and cut, see Sampson-Chen's answer. There are other ways to write the awk script, but they're not materially better than the answer given. Note that you might need to set the field separator explicitly (-F" ") in awk if you do not want tabs treated as separators, or you might have multiple blanks between fields. The POSIX standard cut does not support multiple separators between fields; GNU cut has the useful but non-standard -i option to allow for multiple separators between fields.

You can also do it in pure shell:

while read junk1 junk2 residue
do echo "$residue"
done < in-file > out-file

Its pretty straight forward to do it with only shell

while read A B C; do
echo "$C"
done < oldfile >newfile

perl:

perl -lane 'print join(' ',@F[2..$#F])' File

awk:

awk '{$1=$2=""}1' File

This might work for you (GNU sed):

sed -r 's/^([^ ]+ ){2}//' file

or for columns separated by one or more white spaces:

sed -r 's/^(\S+\s+){2}//' file

Use kscript

kscript 'lines.split().select(-1,-2).print()' file

Using awk, and based in some of the options below, using a for loop makes a bit more flexible; sometimes I may want to delete the first 9 columns ( if I do an "ls -lrt" for example), so I change the 2 for a 9 and that's it:

awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt

참고URL : https://stackoverflow.com/questions/13446255/how-to-remove-the-first-two-columns-in-a-file-using-shell-awk-sed-whatever

반응형