-2

私のファイルには、以下に示すデータが含まれています。

{ "any1", "aaa.bbb.ccc.1.ddd", "var1" }
{ "any2", "aaa.bbb.ccc.1.eee", "toto" }
{ "an42", "aaa.bbb.ccc.1.fff", "titi" }
{ "an47", "aaa.bbb.ccc.2.eee", "var3" }
{ "any7", "aaa.bbb.ccc.2.ddd", "var12" }
{ "a789", "aaa.bbb.ccc.2.fff", "var14" }
{ "any1", "xxx.yyy.zzz.1.ddd", "var1" }
{ "any2", "xxx.yyy.zzz.1.eee", "toto" }
{ "an42", "xxx.yyy.zzz.1.fff", "titi" }

プレフィックスのすべてのインデックスを抽出したい"aaa.bbb.ccc"

したがって、コマンドは返されるはずです

linux# command
1
2

sed, awk, ,grepでそれを作るにはどうすればよいsortですか?

4

3 に答える 3

4

たとえば、次のように言えます。

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file | sort -u
1
2

一歩一歩

後の数字を取得しますaaa\.bbb\.ccc\.(任意の文字ではなく、ドット自体に一致するようにドットをエスケープすることに注意してください):

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file
1
1
1
2
2
2

sortそれらを見つけて、一意の値を見つけます。

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file | sort -u
1
2

との代替sed

-Pにオプションがない場合はgrep、次を使用できますsed

$ sed -nr 's/^.*aaa\.bbb\.ccc\.([0-9]+).*$/\1/p' file
1
1
1
2
2
2
$ sed -nr 's/^.*aaa\.bbb\.ccc\.([0-9]+).*$/\1/p' file | sort -u
1
2
于 2015-04-30T09:17:03.127 に答える
0
sed -n '/.*aaa\.bbb\.ccc\.\([0-9]\{1,\}\).*/ {s//\1/;H;}
   $!d
   s/.*//;H;x
:a
   s/\(\n[^[:cntrl:]]*\)\(.*\)\1\n/\1\2\
/
   ta
   s/.\(.*\)./\1/p' YourFile

楽しみのために、1 (posix) sed で、ソートされていません。(GNU sed はオンライン バージョンを許可します)

于 2015-04-30T09:38:10.750 に答える
0

別のawk方法:

$ awk -F\. '/aaa.bbb.ccc.[0-9]+/{b=$(NF-1);if (!(b in a)){ print b}a[b]++}' infile

手順:

  1. セパレーターFSdot
  2. 欲しいパターンを探す
  3. bインデックス値を変数に格納
  4. 連想配列a を使用して、印刷されたインデックス キーをマークします。
  5. b印刷されていない場合はa、インデックス ( a のキー)
于 2015-04-30T09:38:31.737 に答える