구분 기호 없이 텍스트 파일에서 열 추출

구분 기호 없이 텍스트 파일에서 열 추출

기본적으로 각 줄이 함께 압축된 데이터 스트림인 큰 텍스트 파일이 있습니다. 특정 열의 일부 데이터 오류를 조사해 달라는 요청을 받았습니다. 데이터는 어떤 방식으로든 분리되지 않습니다. 그러나 "열" 길이 목록과 각 "열"에 관련 데이터가 있는지에 대한 설명이 있습니다.

Excel을 사용하겠지만 Excel의 열 구분 제한은 한 줄에 1000자이고 각 줄은 그 이상입니다. 이러한 필드 중 다수에는 필러로 30개의 공백 문자열이 있으며 적어도 15개 정도가 있습니다. 지정된 "빈" 필드를 구문 분석하고 싶습니다.

나에게 필요한 것은 파일을 입력하고 제공할 수 있는 배열을 사용하여 열 길이와 "X"와 같은 표시를 사용하여 무시하고 싶은 해당 열을 무시하고 새 파일을 내보내는 방법입니다. 구분 기호를 사용하면 분석을 위해 Excel로 다시 피드백할 수 있습니다.

예를 들어, 줄이 포함된 파일이 있고 aaaaaabbbbbccccdddddeeeffffff파일에 배열을 제공하면 [6 5 4X 5 3X 6]해당 줄이 포함된 파일이 생성됩니다.aaaaaa^bbbbb^ddddd^ffffff

제가 사용할 수 있는 방법이 있나요 grep? awk아니면 이 작업을 수행할 수 있는 방법이 있나요 sed?

미리 감사드립니다.

답변1

짧은cut명령 모드:

샘플 input.txt콘텐츠:

aaaaaabbbbbccccdddddeeeffffff
wwwwwwddddd111133333xxxaaaaaa
ffffff00000sssszzzzz000rrrrrr

일하다:

cut -c 1-6,7-11,16-20,24-29 --output-delimiter=^ input.txt
  • -c- 문자만 선택

  • 1-6,7-11,16-20,24-29- 연속적인 문자 위치 범위, 유연하고 조정 가능

  • --output-delimiter=^- 출력 필드 구분 기호를 원하는 대로 조정할 수 있습니다.


산출:

aaaaaa^bbbbb^ddddd^ffffff
wwwwww^ddddd^33333^aaaaaa
ffffff^00000^zzzzz^rrrrrr

답변2

GNU awk가 있으면 명시적인 필드 너비를 지정할 수 있습니다.

$ printf 'aaaaaabbbbbccccdddddeeeffffff\n' | 
    gawk -v FIELDWIDTHS="6 5 4 5 3 6" -v OFS="^" '{print $1, $2, $4, $6}'
aaaaaa^bbbbb^ddddd^ffffff

버전 4.2부터 구문을 사용하여 문자를 건너뛸 수 있습니다 n:m.

printf 'aaaaaabbbbbccccdddddeeeffffff\n' |
   gawk -v FIELDWIDTHS="6 5 4:5 3:6" -v OFS="^" '{$1=$1} 1'
aaaaaa^bbbbb^ddddd^ffffff

(지정된 필드 너비로만 재평가를 강제합니다 $1=$.)$0

예시 보기GNU Awk 사용자 가이드: 4.6 고정 너비 데이터 읽기

답변3

정확한 입력과 원하는 출력을 보지 않고는 말하기 어렵지만...

sed -e "$(
  printf '%d\n' 6 5 4 5 3 6 |
    awk '
      {
        f[NR] = f[NR-1] + $1
      }
      END {
        for (i=NR; i>0; i--) {
          printf "s/./&^/%d\n", f[i]
        }
      }
    '
)" infile.txt | cut -d^ -f1,2,4,6

검증되지 않은. 실수는 없을 거라고 약속해요. ;)


네, 테스트해봤습니다. 마지막 버팀대를 놓쳤어요 END. 다른 오류는 없습니다. 예제 입력에서 완벽하게 작동합니다. 출력은 다음과 같습니다

aaaaaa^bbbbb^ddddd^ffffff

답변4

개선된 버전로만 페레크레스트의 cut답변X, 건너뛸 열 수를 표시하는 접미사를 포함하는 열 배열 파서 포함 .

배열을 로드 $n하고 배열을 숫자로 구문 분석하는 함수를 만듭니다 cut -c.

n=(6 5 4X 5 3X 6)
col_array() { j=$(h=0; 
                  for f in $@; do 
                      g=${f/[Xx]};
                      i=$((h+1));
                      h=$((h+g));
                      [ $g = $f ] && echo -n $i-$h,
                  done;) ; 
              echo ${j%,}; }

문서입력.txt포함하다:

aaaaaabbbbbccccdddddeeeffffff
wwwwwwddddd111133333xxxaaaaaa
ffffff00000sssszzzzz000rrrrrr

col_array()다음과 함께 사용 cut:

cut -c $(col_array  ${n[@]}) --output-delimiter=^ input.txt

산출:

aaaaaa^bbbbb^ddddd^ffffff
wwwwww^ddddd^33333^aaaaaa
ffffff^00000^zzzzz^rrrrrr

col_array()인수가 구문 분석되므로 배열이 꼭 필요하지는 않습니다 .

cut -c $(col_array 3 5X 7) --output-delimiter=^ input.txt

산출:

aaa^bbbcccc
www^ddd1111
fff^000ssss

관련 정보