sedを使用して任意の文字列を除くすべてを削除する方法

sedを使用して任意の文字列を除くすべてを削除する方法

皆さん、問題が生じました。

サンプルデータがあります

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つのフィールドとその後のスペースを削除してから削除します_。最後に、すべてのスペース/とをに変更します|

関連情報