awk sed if 文

awk sed if 文

その行の 2 番目の文字に「.」がある場合、先頭に 0 を追加しようとしています。この 2 つを組み合わせることはできませんでした。

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

に入るのは、前の条件が真の場合に、現在の行の内容である の前にゼロを{ ... }追加するコードです。$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その行の先頭をゼロに置き換えて、実質的に先頭にゼロを追加します。

sed 式はs/.\{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特に は月をゼロで埋めますが、これがあなたがしようとしていることのようです。

クサラナンダ氏は次のように指摘している。

さらにコンパクト(GNU date と Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'

答え4

sedを使えば

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

これは、^行の先頭にアンカーするために を使用し、次にグループ内の任意の 1 文字をキャプチャし、その後にリテラル.、その他をキャプチャします。これに一致すると、 を出力し0、次に最初のキャプチャ グループ (行の先頭の文字)、次に を出力し、.次に 2 番目のキャプチャ グループ (行の残りの部分) を出力します。

関連情報