파일이 있습니다:
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