programing

처음 n 개와 마지막 n 개 열을 자르는 방법?

nasanasas 2020. 11. 15. 11:22
반응형

처음 n 개와 마지막 n 개 열을 자르는 방법?


탭으로 구분 된 파일에서 처음 n 개와 마지막 n 개 열을 어떻게 잘라낼 수 있습니까?

나는 이것을 처음 n을 자르려고 시도했습니다 . 하지만 첫 번째와 마지막 n 열을 결합 할 생각이 없습니다.

cut -f 1-10 -d "<CTR>v <TAB>" filename

Cut은 -f다음 에서 여러 범위를 취할 수 있습니다 .

최대 4 개 및 7 개 이상의 열 :

cut -f -4,7-

또는 필드 1,2,5,6 및 10부터 :

cut -f 1,2,5,6,10-

기타


AWK를 사용하여 첫 번째 및 마지막 필드를 자르려면 :

awk '{$1 = ""; $NF = ""; print}' inputfile

불행히도 필드 구분 기호가 남아 있으므로

aaa bbb ccc

된다

[space]bbb[space]

여분의 공백을 남기지 않지만 요구 사항에 맞는 방식으로 kurumi의 답변을 사용하여 이렇게하려면 :

awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

이것은 또한 그 대답의 몇 가지 문제를 해결합니다.

이를 일반화하려면 :

awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

그런 다음 명령 시작 부분에서 변수 할당을 변경하여 시작 또는 끝에서 건너 뛸 필드 수를 변경할 수 있습니다.


다음,
-d를 사용하여 잘라낼 수 있습니다 : delimiter, 필드의 경우 -f
탭으로 구분 된 필드에 사용되는 \ t

cut -d$'\t' -f 1-3,7-

이를 위해 Bash를 사용할 수 있습니다.

while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt

질문의 첫 번째 부분은 쉽습니다. 이미 지적했듯이 cut은 열 범위의 시작 또는 끝 인덱스를 생략하여 "시작에서 열 n (포함)"또는 "열 n (포함)에서 끝까지 "를 의미하는 것으로 해석합니다. 각기:

$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test

또한 범위 결합 을 지원 합니다. 원하는 경우, 예를 들어 7 개 열의 행에서 처음 3 개 및 마지막 2 개 열 :

$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz

그러나 질문의 두 번째 부분은 기대하는 입력의 종류에 따라 약간 까다로울 수 있습니다. "마지막 n 개 열"이 "마지막 n 개 열 (전체 행의 인덱스에 관계없이)"을 의미하는 경우 (즉, 미리 찾을 열 수를 반드시 알 필요가 없기 때문에) 슬프게도 이것은 그렇지 않습니다. cut혼자서도 가능합니다 . 효과적으로 사용하기 위해 cut"최종 인발 N의 각 라인에서 열"의 총 개수 의 열을 미리 알고 있어야 각 행에 존재하는, 그리고 , 각 라인에 포함 열의 수에 일치해야한다.

당신이 경우에 하지 얼마나 많은 "열"을 알고 각 라인에 존재할 수있다 (예를 들면 엄격 표 아니다 입력하면있는 거 작업이 있기 때문에), 다음과 같은 사용 뭔가해야합니다 awk대신. 예를 들어, 입력의 각 줄에서 awk마지막 2 개의 "열"(awk는 필드를 호출하며 그 개수는 줄마다 다를 수 있음)를 꺼내는 데 사용 합니다 .

$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d

awk를 사용할 수 있습니다. 예를 들어 첫 번째, 두 번째 및 마지막 3 개 열을 잘라냅니다.

awk '{for(i=3;i<=NF-3;i++} print $i}' file

Ruby (1.9+)와 같은 프로그래밍 언어가있는 경우

$ ruby -F"\t" -ane 'print $F[2..-3].join("\t")' file

다음을 시도하십시오.

echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""

참고 URL : https://stackoverflow.com/questions/4956873/how-to-cut-first-n-and-last-n-columns

반응형