쉘 (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
'Program Tip' 카테고리의 다른 글
시간 명령에 대한 사용자 정의 형식 (0) | 2020.11.06 |
---|---|
node.js에서 데이터베이스를 조롱합니까? (0) | 2020.11.06 |
원격 모달이있는 부트 스트랩 3 (0) | 2020.11.06 |
이 두 비교 결과가 다른 이유는 무엇입니까? (0) | 2020.11.06 |
Ubuntu에서 PyCharm 실행기 다시 만들기 (0) | 2020.11.06 |