ファイルがあります:
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
grep
1行のコードでこれを行うことができます。
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