追加の区切り文字がある場合は、最後の区切り文字を削除します。

追加の区切り文字がある場合は、最後の区切り文字を削除します。

ファイルがあります:

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

2行目に追加の区切り文字があるので、それを削除したいと思います。 Unixではどうすればいいですか?

出力には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

grep1行のコードでこれを行うことができます。

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各レコードの終わりにある1つ以上のパイプを単一のパイプに置き換えます。

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

関連情報