필드의 구분 기호 바꾸기

필드의 구분 기호 바꾸기

필드가 .으로 구분된 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

관련 정보