awk sed if ステートメント

awk sed if ステートメント

行の2番目の文字に「.」がある場合は、最初に0を追加しようとします。私はそれらを組み合わせることができませんでした。

awk '{ print substr( $0, 2, 1 ) }' file.txt 

2番目の文字を表示

sed -ie "s/.\{0\}/0/" file.txt

最初にゼロを追加してください。

「2番目の文字がドットの場合」が必要です。

サンプルファイル:

1.02.2017 23:40:00
10.02.2017 23:40:00

決定的な:

01.02.2017 23:40:00
10.02.2017 23:40:00

答え1

私たちは問題を完全に解決するために、またはsedいずれかを使用することができます。awk


そしてsed

$ sed 's/^.\./0&/' file.txt

&置換コマンド()の置換部分にある場合、sコマンドのパターン部分と一致する入力行部分まで拡張されます。

正規表現^.\.は「^()で始まり、文字(.)の後にリテラルポイント(\.)が続くすべての行と一致します。」。

行がある場合、1.02.2017 23:40:00パターンは一致し、1.行の先頭で置き換えられます。01.


そしてawk

awk質問のコード部分に基づいて...

上記のように、各行に入力された2番目の文字が印刷されます。

$ awk '{ print substr($0, 2, 1) }' file.txt

2 番目の文字が返されるという事実をsubstr($0, 2, 1)条件として使用できます。

$ awk 'substr($0, 2, 1) == "." { ... }' file.txt

前の条件がtrueの場合は、現在行の内容の前に0を追加するコードを入力してください{ ... }$0

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt

その後、すべての行が印刷されていることを確認してください。

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt

もちろん、条件をsubstr($0, 2, 1) == "."正規表現に変更することもできます(sedソリューションで使用したものとまったく同じものを使用します)。

$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt

「短いほど良い」と思っている人の中には、次のように書いています。

$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt

(そしておそらくほとんどのスペースも削除されたでしょうawk '/^.\./{$0="0"$0}1' file.txt。)

答え2

sedを使用してください:

sed -e "/^.\./s/^/0/" file.txt 

このパターンは、/^.\./行の先頭ですべての文字とリテラルポイントを検索し^、一致する場合はs行の先頭を0に置き換えて、効果的に先頭に0を追加します。

sed式はs/.\{0\}/0/少し奇妙です。 0個以上のコピーと一致し、それを0に置き換えます。もちろん、パターンは文字列内のすべての位置と一致しますが、s///最初の項目のみが置き換えられるため、期待どおりに機能します。しかし、これは奇妙なアプローチです。


または、awkを使用すると、同様の正規表現がその行と一致しますが、次のように使用できますsubstr

awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 

まず、2番目の文字がドットかどうかをテストし、その場合は行の前にゼロを追加します。最後は、変更後に行を印刷するデフォルトの動作を呼び出します。

答え3

awkとsedについて話していますが、日付形式を指定したいようです。これには対応するdateコマンドを使用します。たとえば、

echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d

出力されます

01.02.2017 23:40:00

sed途中のコマンドは、に入力するピリオドをスラッシュに変更しますdate -d。フォーマットオプションを使用すると、ほぼすべてのフォーマットで出力できます。特に%m月はゼロで埋められ、これはあなたが望むようです。

Kusaranandaが指摘したように:

より簡潔(GNU日付とBash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'

答え4

sed を使うとそうかもしれません。

sed 's/^\(.\)\.\(.*\)/0\1.\2/'

^これは行の先頭に固定し、グループ内の単一文字、テキスト、および.その他の項目をキャプチャするために使用されます。一致する場合は、aを印刷して0最初のキャプチャグループ(行の先頭の文字)を印刷し、aを印刷してから.2番目のキャプチャグループ(行の残りの部分)を印刷します。

関連情報