
皆さん、問題が生じました。
サンプルデータがあります
2021-04-15 07:47:34 629 deveon3/10d/023aad3eab0a035aef3771c9220940e200a00000000242e5_0.gt
私だけが必要
023aad3eab0a035aef3771c9220940e200a00000000242e5
頑張る
grep _0.gt test.txt | sed "s/.* \(.*\) \(...\)\/\(.*\)_0.gt/\1|\2|\3/g" > test.dat
しかし、結果は同じであり、違いはありません。
私が探しているのは私が持っているものです。
2018-10-20 19:34:23 1668004 000/02001386c62785e42231c679c614228a04000090022ff989_0.gt
2018-10-20 21:18:58 1694936 000/02001386c62785e72231c679c614228a040000000232d761_0.gt
2018-10-20 23:59:40 1828575 000/020057386c6278e72231c679c644228a04000000023696fb_0.gt
出力を受け取る
1668004|000|02001386c62785e72231c679c614228a04000000015528dd
1694936|000|02001386c62785e72231c679c614228a040000000166bca7
1828575|000|02001386c62785e72231c679c614228a04000000022f8f33
そうでなければ
02001386c62785e72231c679c614228a04000000015528dd
02001386c62785e72231c679c614228a040000000166bca7
02001386c62785e72231c679c614228a04000000022f8f33
私は何が間違っていましたか?
答え1
awk -F'[_/ ]+' '{ print $5 }' infile
awk -F'[_/ ]+' -v OFS="|" '{ print $3, $4, $5 }' infile
答え2
各行でスペースで区切られた最後のフィールドと4番目のフィールド/
の間にデータが必要であるとします。_
$ awk '{ sub(".*/","",$4); sub("_.*","",$4); print $4 }' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
sub()
これは、4番目のフィールドの最後のフィールド/
の前後に表示されるすべての項目を切り捨てるために2回使用されます_
。次に、フィールドの残りの内容を印刷します。
置換を使用し、他の文字sed
がないとします。/
後ろに私たちが興味を持っているデータ:
$ sed 's|.*/||; s/_.*//' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
3番目のフィールドでより多くの情報を取得し、区切り文字をに変更するには、次のように使用|
できます。awk
$ awk -v OFS='|' '{ gsub("/",OFS,$4); sub("_.*","",$4); print $3,$4 }' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
/
4番目のフィールドのすべての項目を何でも変更することから始めますOFS
(出力フィールドの区切り文字であるため、|
コマンドラインで設定しました)。次に、次のすべての項目を切り取り、前のように_
3番目と4番目のフィールドを印刷します。
ここにあります。sed
少しぎこちないですが、うまくいきます。
$ sed 's/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{2\}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
-E
または、拡張正規表現を使用するには、非標準オプションを使用してください。
$ sed -E 's/([^[:blank:]]+[[:blank:]]+){2}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
まず、最初の2つのフィールドとその後のスペースを削除してから削除します_
。最後に、すべてのスペース/
とをに変更します|
。