추가 구분자가 있는 경우 마지막 구분자를 제거합니다.

추가 구분자가 있는 경우 마지막 구분자를 제거합니다.

파일이 있습니다:

a|b|c|d
x|y|z|n|||||||||
p|q|r|s|
g|h|i|
w|e|r||

이제 두 번째 줄에 추가 구분 기호가 있으므로 이를 제거하고 싶습니다. 유닉스에서는 어떻게 할 수 있나요?

출력에는 4개의 파이프 구분 기호만 있어야 합니다.

a|b|c|d
x|y|z|n
p|q|r|s
g|h|i|
w|e|r|

답변1

이 경우 awk는 읽기 쉽다고 생각합니다.

$ awk -F'|' -vOFS='|' '{NF=4}1' file
a|b|c|d
x|y|z|n
p|q|r|s
g|h|i|
w|e|r|

이 답변은 후행 파이프 기호를 제거하지 않고 출력의 열을 4로 설정합니다. 다음 수정된 예의 경우:

$ cat file
a|b
x|y|z|n||||
p|q|r|s
g|h|i|
w|e|r||

$ awk -F'|' -vOFS='|' '{NF=4}1' file
a|b||
x|y|z|n
p|q|r|s
g|h|i|
w|e|r|

답변2

grep한 줄의 코드로 이 작업을 수행할 수 있습니다.

cat data.csv | grep -Po '^(\w*\|){3}\w*$'

Python을 사용하여 이 작업을 쉽게 수행할 수도 있습니다. 원하는 작업을 수행하는 Python 스크립트는 다음과 같습니다.

#!/usr/bin/env python2
# -*- coding: ascii -*-
"""shortencsv.py"""

import sys

cols = 4

with open(sys.argv[1]) as csvfile:
    for line in csvfile:
        print('|'.join(line.strip().split('|')[:cols]))

다음과 같이 실행할 수 있습니다.

python shortencsv.py data.csv

답변3

sed각 레코드의 끝에 있는 하나 이상의 파이프를 단일 파이프 로 바꿉니다.

sed 's/|\+$/|/' infile

견본:

a|b|c|d
x|y|z|n|||
p|q|r|s
g|h|i|sx|sxa
w|e|r||

산출:

a|b|c|d
x|y|z|n|
p|q|r|s
g|h|i|sx|sxa
w|e|r|

답변4

awk는 더 복잡한 작업에 적합하지만 이 간단한 작업은 cut을 사용하여 더 빠르게 수행할 수 있습니다.

$ echo "$a"
a|b|c|d
x|y|z|n|||||||||
p|q|r|s|
g|h|i|
w|e|r||

$ time awk -F'|' -vOFS='|' '{NF=4}1' <(for i in {1..100000};do echo "$a";done)

a|b|c|d
x|y|z|n
p|q|r|s
g|h|i|
w|e|r|

real    0m3.850s
user    0m2.105s
sys 0m1.481s

$ time cut -d'|' -f1-4 <(for i in {1..100000};do echo "$a";done)
a|b|c|d
x|y|z|n
p|q|r|s
g|h|i|
w|e|r|
.....
.....

real    0m2.844s
user    0m1.384s
sys 0m1.268s

귀하의 경우에는 그냥 사용하십시오

cut -d'|' -f1-4 inputfile

관련 정보