
次の形式の文字列リストがあります。それぞれのセクションを抽出するには、どのようなコマンドを使用すればよいでしょうか。grep を使用してキーワード (ADD、username(atra522) など) を抽出しようと考えています。この問題にはどのように対処すればよいでしょうか。
cop1010 ADD atra522,Allison Track,CT,canada
cut または awk を使用してコンマを探してすべてのフィールドを取得する方法はわかっていますが、最初のフィールド「cop1010 ADD atra522」でそれを機能させる方法がわかりません。
答え1
おっしゃる通りbash
、すべてをシェルの組み込み関数で実行してみましょう。
$ inp="cop1010 ADD atra522,Allison Track,CT,canada"
$ IFS=, fields=($inp)
$ echo ${fields[0]}
cop1010 ADD atra522
$ echo ${fields[1]}
Allison Track
$ echo ${fields[2]}
CT
$ echo ${fields[3]}
canada
$ IFS=\ cmd=(${fields[0]})
$ echo ${cmd[0]}
cop1010
$ echo ${cmd[1]}
ADD
$ echo ${cmd[2]}
atra522
$
これらすべてを変数として設定することができ(エコーするのではなく)、、、またはその他のツールawk
を実行するためにサブシェルを生成する必要はありません。cut
答え2
awkのsplit
関数を使用して、最初のフィールドをさらに配列に分割することができます。
echo 'cop1010 ADD atra522,Allison Track,CT,canada' |
awk -F, '{
split($1,a,"[ \t]+");
if (a[2] == "ADD") {
printf "Adding user: %s\n", a[3];
}
}'
答え3
Pythonソリューション:
import re,sys;
for l in sys.stdin:
if 'ADD' in l:
data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:]
print " ".join(data)
data = []
OP の例に基づいてカスタム ファイルでテストしました:
$ cat input.txt
cop1010 ADD atra522,Allison Track,CT,canada
some other stuff
testuser ADD test522,Allison TEST,CT,germany
$ python user_data.py < input.txt
atra522 Allison Track CT canada
test522 Allison TEST CT germany
Python 3 との互換性とデータのきれいな印刷のために、次のようなことができます。
$ cat user_data.py
from __future__ import print_function
import re,sys;
for l in sys.stdin:
if 'ADD' in l:
data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:]
print("Username: " + data[0])
print("Real Name: " + data[1])
print("Some kind of two char string: "+ data[2])
print("Location: " + data[3])
print("- - -")
data = []
$ python user_data.py < input.txt
Username: atra522
Real Name: Allison Track
Some kind of two char string: CT
Location: canada
- - -
Username: test522
Real Name: Allison TEST
Some kind of two char string: CT
Location: germany
- - -