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