하나의 열이 여러 행으로 나누어진 이전 행에 행을 추가합니다.

하나의 열이 여러 행으로 나누어진 이전 행에 행을 추가합니다.

설명 필드 값은 여러 행에 존재할 수 있습니다. 아래와 같이 한 줄에 넣고 싶습니다. 파일에는 고정된 수의 열이 있습니다.

입력 파일:

Number|Level|Description|Unit|Rate|Special Rate|Notes  
101|0|Apple, Orange, Banana||6.80%|8.56|Free                
   |1|Fruits:||||   
102|2|Banana,      
Orange, Grapes  
Kiwi||||

"|"가 포함되지 않은 행 또는 "|"가 포함된 행이지만 해당 행의 "|" 값 수가 4인 경우 해당 행은 "|"가 포함된 이전 행에 추가되어야 합니다.

결과물 파일:

Number|Level|Description|Unit|Rate|Special Rate|Notes      
101|0|Apple,Orange, Banana||6.80%|8.56|Free                 
   |1|Fruits:||||       
102|2|Banana,Orange, Grapes Kiwi||||

답변1

다음은 원하는 작업을 수행하는 간단한 Python 스크립트입니다.

#!/usr/bin/env python2
# -*- ascii -*-
"""rewrapcsv.py"""

import sys

datafile = sys.argv[1]
columns = int(sys.argv[2])

with open(datafile) as filehandle:
    buffer = []
    for line in filehandle:
        buffer.extend(line.strip().split('|'))

    while len(buffer) >= columns:
        print('|'.join(buffer[0:columns]))
        buffer = buffer[columns:]

    print('|'.join(buffer[0:columns]))

data.csv다음은 귀하의 질문( )에서 가져온 샘플 데이터 파일입니다.

Number|Level|Description|Unit|Rate|Special Rate|Notes
101|0|Apple, Orange, Banana||6.80%|8.56|Free
|1|Fruits:||||
102|2|Banana,
Orange, Grapes Kiwi||||

스크립트를 실행하는 방법은 다음과 같습니다.

python rewrapcsv.py data.csv 6

출력은 다음과 같습니다.

Number|Level|Description|Unit|Rate|Special Rate
Notes|101|0|Apple, Orange, Banana||6.80%
8.56|Free||1|Fruits:|
|||102|2|Banana,
Orange, Grapes Kiwi||||

답변2

Awk해결책:

awk -F'|' 'r{ if (NF!=1 && NF!=5) print r; else { print r,$0; next } }{ r=$0 }' file
  • -F'|'- 필드 구분 기호
  • r- 이전 기록이 포함되어 있습니다.

산출:

Number|Level|Description|Unit|Rate|Special Rate|Notes
101|0|Apple, Orange, Banana||6.80%|8.56|Free
   |1|Fruits:||||
102|2|Banana, Orange, Grapes Kiwi||||

답변3

sed해결책:

sed -E -e :a -e '/(\|.*){6,}/!N;s/\n/ /;ta' file

확장 정규식은 (\|.*){6,}6개 이상의 섹션이 포함된 행과 일치합니다. 현재 행이 이 행과 일치하지 않으면 다음 행이 추가됩니다( !N).

s/\n/ /줄 바꿈을 공백으로 바꾸십시오. 대체가 이루어졌다면 행이 추가되었다는 의미이므로 다시 테스트해야 하므로 ta플래그로 점프하여 :a대체가 이루어졌는지 확인하세요. 완벽한.

답변4

사용하기 전에...

ex +'g/^\([^|]\+\(|[^|]*\)\{4}\|[^|]\+\)$/norm! kgJ' +wq file

또는 똑같지만 "매우 마법적인" 패턴(패턴의 시작 부분)을 사용하면 ... 제 생각에는 문자 그대로의 의미만 이스케이프하면 되기 \v때문에 눈이 좀 더 편할 것 같습니다 ...|

ex +'g/\v^([^\|]+(\|[^\|]*){4}|[^\|]+)$/norm! kgJ' +wq file

Vim은 최신 시스템에서 Ex를 구현하므로 Vim을 알고 있다면 이러한 ex명령이 익숙해 보일 수 있습니다. 첫 번째 명령(첫 번째 명령 이후 +)은 "전역" 명령입니다. 패턴 중 하나가 발견되면( |한 줄에 없음 또는 4개) 일반 모드 명령이 실행되어 한 줄 위로 이동하고( ) 다음 줄에 합류합니다( ).|kgJ

이것은 몇 안되는 휴대용 솔루션 중 하나입니다.그 자리에서 파일을 업데이트합니다. ( sed -i예를 들어 GNU는 임시 파일을 사용합니다).

다음은 두 번째 패턴("줄에 |가 포함되어 있지 않음")에 대한 입력 및 테스트입니다.

Number|Level|Description|Unit|Rate|Special Rate|Notes  
101|0|Apple, Orange, Banana||6.80%|8.56|Free                
   |1|Fruits:||||   
102|2|Banana,      
Orange, Grapes    Kiwi||||
103|2|Watermelon,
Pear, Raspberry, Lime

결과:

Number|Level|Description|Unit|Rate|Special Rate|Notes
101|0|Apple, Orange, Banana||6.80%|8.56|Free
   |1|Fruits:||||
102|2|Banana,Orange, Grapes    Kiwi||||
103|2|Watermelon,Pear, Raspberry, Lime

관련 정보