필드가 .으로 구분된 CSV가 있습니다 |
.
|time: 10:19 | Error: File not found| Condition: None | path: some
|time: 10:20 | Error: File not found| Condition: a|b | path: some
구분 기호는 |
때때로 네 번째 필드(필드 Condition
)에 나타납니다. 나는 그것을 |
다음으로 바꾸고 싶습니다 OR
:
Condition: a|b
될 것입니다: Condition: a OR b
이를 달성하기 위해 sed 또는 awk를 어떻게 사용할 수 있습니까?
답변1
awk -F'|' -v OFS='|' 'NF == 6 {$4 = $4 " OR " $5; $5=$6; NF--} 1' file
이는 파이프로 구분된 필드에서만 작동합니다. 5개가 예상되지만, 1개가 더 있으면 원하는 문자열과 연결하세요.
또는 GNU sed:
sed 's/|/|/5; ta; n; :a; s/|/ OR /4' file
튜브가 5개 있으면 4번째 튜브를 교체하세요. MacOS에서 기본 sed에서는 작동하지 않습니다. MacOS sed는 세미콜론이 개행 문자로 대체된 경우 이 명령을 사용할 수 있습니다(BSD 파생 sed의 경우 레이블 이름 뒤에 개행 문자가 와야 하는 것 같습니다).
있다면 어떨까요?더추가 파이프가 1개 이상인가요? 다음 문서를 고려해보세요:
|time: 10:19 | Error: File not found| Condition: None | path: some
|time: 10:20 | Error: File not found| Condition: a|b | path: someh
|time: 12:34 | NO ERROR | Condition: a|b AND c|d AND e|f | path: nil
sed 확장하기 해결책은 간단합니다. "jump-if"를 추가하면 됩니다.
sed ':b; s/|/|/5; ta; n; :a; s/|/ OR /4; tb' file
awk는 약간 장황해집니다.
awk -F'|' -v O FS='|' '{
while (NF > 5) {
$4 = $4 " OR " $5
for (i = 5; i < NF; i++)
$i = $(i+1)
NF--
}
print
}' file
답변2
이것을 테스트해 보세요:
sed 's/Condition:[ ]*\([a-zA-Z]*\)|\([a-zA-Z]*\)/Condition: \1 OR \2/g' your_file
a
그것을 가정 하고 b
문자입니다.
답변3
Python3 스크립트. csv 파일을 구분 기호 "|"로 정의된 목록으로 나눈 다음 추가 필드가 있고 "condition:"이라는 단어로 시작하는 경우 해당 필드를 결합합니다.
import csv
for line in list(csv.reader(open('filename', 'r'), delimiter='|')):
if len(line) > 5 and line[3].lstrip().startswith('Condition:'):
print('|'.join(line[:3] + [line[3] + ' OR ' + line[4]]+line[5:]))
else:
print('|'.join(line))
답변4
코드 예제에서 규칙이 |
정의된 곳마다 나타납니다.아니요양쪽에 공간이 있어서 OR
너무 심플 하고 싶잖아요
sed -E 's/([^ ])\|([^ ])/\1 OR \2/g' test