0

各行に 1 つ以上の電子メール ID を持つテキスト ファイルがあります。例えば

id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  

ここでの問題は、id:value が 1 行に 1 回以上表示される可能性があることです。出力が次のようになるように、すべての id:value ペアを抽出するにはどうすればよいですか?

id:123, id:5678  
id:567  
id:3643, id:6721  

私は試しegrep -oましたが、それは各id:valueペアを別々の行に入れています.

sed/awkトリックを行う必要がありますが、私は初心者です

PerlPerl のインストールが必要になるため、使用したくありません。

編集: データ ファイルをさらに分析すると、一貫性のない区切り記号が表示されます。つまり、すべての行が,区切られているわけではありません。と で区切られているものも:あり|ます。また、,アドレス値フィールド内に表示されます。すなわちaddress:52nd st, new yorkawkこれは正規表現を使用して行うことができますか?

4

5 に答える 5

2

コンテンツがファイル内にある場合はtest.txt、次のコマンドを実行します。

cat test.txt | sed 's/ *: */:/g' | grep -o 'id:[0-9]*'

戻ります:

id:123
id:5678
id:567
id:3643
id:6721

sed コマンドは、コロンに隣接するスペースを削除し、次の出力を生成します。

id:123, name:test, id:5678, name john, address:new york
id:567, name:bob
id:3643, name:meg, id:6721, name kate, address:la

このgrep -oコマンドは、入力文字列の一致する部分のみを返すid:を使用して、0 個以上の数字で始まるすべての一致を検索します。-o

マニュアルページによると:

-o, --only-matching    Print only the matched (non-empty) parts of a matching 
                       line, with each such part on a separate output line.

(参考までに、grep と sed コマンドは正規表現を使用しています。)

編集: 申し訳ありませんが、よく読んでいませんでした。-o1 行に 1 つの値を出力する形式に反対されているようですね。ふりだしに戻る...

注:-o出力に反対する理由が行番号を保持することである場合、を使用grep -noすると次の出力が得られます(最初の番号は行番号です)。

1:id:123
1:id:5678
2:id:567
3:id:3643
3:id:6721

多分それは役立ちますか?

于 2013-07-19T03:54:07.530 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r 's/\<id:\s*/\n/g;s/,[^\n]*//g;s/\n/, id:/g;s/^, //' file

単語id:とそれに続くスペースを一意のトークン (この場合は\n) に変換します。,a に続く aまでのすべてを削除し\nます。\nをトークンに置き換えてから, id:、先頭の を削除し,ます。

于 2013-07-20T09:57:30.197 に答える
1

これはうまくいくはずです:

 awk -F, '{id=0;for(i=1;i<=NF;i++) if($i~/id:/) id=id?id FS $i:$i; print id}' file

テスト:

$ cat file
id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  

$ awk -F, '{id=0;for(i=1;i<=NF;i++) if($i~/id:/) id=id?id FS $i:$i; print id}' file
id:123, id: 5678
id:567
id:3643, id: 6721
于 2013-07-19T03:55:27.233 に答える
0
perl -lne 'push @a,/id:[^,]*/g;print "@a";undef @a' your_file

以下でテスト:

> cat temp
id:123, name:test, id: 5678, name john, address:new york  
id:567, name:bob  
id:3643, name:meg, id: 6721, name kate, address:la  
> perl -lne 'push @a,/id:[^,]*/g;print "@a";undef @a' temp
id:123 id: 5678
id:567
id:3643 id: 6721
>
于 2013-07-19T05:57:20.810 に答える
0

これは、すでに与えられた回答の単なるバリエーションです..私は個人的に、コマンドラインよりもファイル内のスクリプトバージョンを好みます(より良い制御、読みやすさ)

id.txt

id:1、name:test、id:2、name john、address:new york  
id:3、名前:ボブ  
id:4、名前:meg、id:5、名前はケイト、住所:la  

id.akw

{
i=0
for(i=1;i<=NF;i++)
{ if($i~/id:/)
id=id?id $i:$i;}
print id
id=""
}

呼び出し: awk -f id.awk id.txt
出力:

ID:1、ID:2、
id:3,
ID:4、ID:5、
于 2013-07-19T12:21:33.083 に答える