ファイル名と一致する行間の間隔でgrep出力形式を使用しますか?

ファイル名と一致する行間の間隔でgrep出力形式を使用しますか?

ファイル名と一致する行の間にスペースを追加するには?多くのファイルに対して "grep" を実行すると、grep はファイル名と行の間の区切り文字として "-" または ":" (数値または文字列を意味する) を使用するように見えます。したがって、行によっては、区切り文字が最初の文字に連結されたり、区切られたりすることがあります。その後の作業では、これを一貫して行うことができますか?連続操作で「awk」を使用して同じ列の数を取得したいと思います。詳細は次のとおりです。

最初の列が右揃えの5桁の数字のように見えるようにファイルを作成できます。ループの終了条件によって、ループの最後の行が異なる場合があります。次の行「...optimization bla bla」を使用して、ループの最後の行を見つけます。

ファイルケース1

 9969 2020-11-23T14:20:09   6.7433e-02 1.0544e-03 - 2.1166e-03 C 1.2973e-01 - 1.4468e+00 C
...optimization unsuccessful. 

他のファイルのケース2

10072 2020-11-23T14:30:48   6.7384e-02 1.0569e-03 - 2.1148e-03 C 1.2968e-01 - 1.4539e+00 C
...optimization unsuccessful.

私は「awk」を使って8番目の値である8ドルを得たいと思います。だから私は走る

grep "optimization un" */log.txt -B 1

出力は次のとおりです

NN14/log.txt- 5015 2020-11-21T00:13:37   7.4772e-02 9.5215e-04 - 2.2506e-03 C 1.3664e-01 - 1.2459e+00 C
NN14/log.txt:...optimization unsuccessful. 392.1 min.
NN18/log.txt-10080 2020-11-23T22:41:12   6.5363e-02 9.1362e-04 - 2.4192e-03 C 1.2775e-01 - 1.3058e+00 C
NN18/log.txt:...optimization unsuccessful. 1517.2 min.

その後、次のように番号を取得したいと思います。

grep "optimization un" */log.txt -B 1 | awk '/T/ {print $8}'

すると結果はこうなる

C
1.2775e-01

そこで、「NN14/log.txt-5015」と「NN18/log.txt-10080」を空白の有無にかかわらず同じ形式に変更したいと思います。どうすればいいですか?それとも別の方法がありますか?タブに-Tを使用してみましたが、ファイル名側ではなく行側に区切り文字が追加されて動作しません。

ベストアンサー1

メタ:コメントに説明が多すぎますが、質問に対する回答はありません。

「最初にファイルの中央にあるシリアル番号の最後の行を見つける必要があります」という言葉が何を意味するのかわかりません。表示するコマンドは、「optimization un」文字列を含む行(表示するデータに文字「T」も含む場合)の前の行を選択します。連続することができますが、選択は連続した数字または偶数とは関係ありません。選択は文字列と文字のみに基づいています。

複数のファイルをgrepingしている*/log.txtので基本grep 出力は、ファイル名とダッシュまたはコロンで各行を開始します。 (これは「数値または文字列」とは関係ありません。行にコロンを使用します。マッチ行の正規表現とダッシュ今後または後ろに-Bオプション(使用済み)または.)のために含まれる一致-A。ただし、コロンとダッシュの両方が空白ではないため、行が時々ユーザーなどの空白で始まる場合、これはawk空白を使用した基本フィールドの解析に影響します。 (awkフィールドの解析できる変更されましたが、お客様のデータ型に適した変更はありません。 )

ただし、選択した行とフィールドはawkファイル名に依存するか、ファイル名を含めないため無視する動作するファイル名です。ファイル名を省略しますgrep -h。これを試してみてくださいgrep -h -B1 "optimization un" */log.txt(このようなオプションは-h -B1正規表現/パターンとファイル名の前に来る必要がありますが、GNU grepを使用すると拡張子の後に置くことができます)。これにより、次のデータが表示されます。

 5015 2020-11-21T00:13:37   7.4772e-02 9.5215e-04 - 2.2506e-03 C 1.3664e-01 - 1.2459e+00 C
...optimization unsuccessful. 392.1 min.
10080 2020-11-23T22:41:12   6.5363e-02 9.1362e-04 - 2.4192e-03 C 1.2775e-01 - 1.3058e+00 C
...optimization unsuccessful. 1517.2 min.

(IMEにはブロックを区切る行もあるはずですが、--表示しませんawk)。

さて、元のパイプを通過すると| awk '/T/{print $8}'正常に動作します。

grepしかし、私が言ったように(そしてその形式も)まったく必要ありません。以下を行います。

awk '/optimization un/{print x} {x=$8}' */log.txt

これらのうちの1つは問題を解決する必要がありますが、それらのどれも質問した質問に答えません(ファイル名と一致する行の間にスペースを入れます)。したがって、スタックポリシーによっては、これは有効な答えではないため、削除する必要があります。

おすすめ記事