설명 필드 값은 여러 행에 존재할 수 있습니다. 아래와 같이 한 줄에 넣고 싶습니다. 파일에는 고정된 수의 열이 있습니다.
입력 파일:
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개) 일반 모드 명령이 실행되어 한 줄 위로 이동하고( ) 다음 줄에 합류합니다( ).|
k
gJ
이것은 몇 안되는 휴대용 솔루션 중 하나입니다.그 자리에서 파일을 업데이트합니다. ( 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