文字列の最後の項目を除いてすべてを削除するにはどうすればよいですか?

文字列の最後の項目を除いてすべてを削除するにはどうすればよいですか?

2016/01/30 14:52:51:最後の項目を除くすべての項目を削除しようとしています。私はこれを試しました:

awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

最後の項目を除くすべての項目を何もないものに置き換えます。ただし、これは2016/01/30 14:52:51:わずかに異なる数字で4回だけ繰り返されます。

ベストアンサー1

このスクリプトにはいくつかの問題があり、問題の説明にはいくつかの説明が必要です。

  • gsub呼び出しの無効な正規表現パラメータ
  • アップデートは(ステートメントで使用されている値)には$1影響しません。$0print
  • OPは、行の最後のイベントを変更せずに維持することを意図したのか、それとも日付を含む最後の行だけを維持したいのか(後者がより可能性が高い)、はっきりと述べていません。

以下は、これらの修正と前提を含むスクリプトです。

#!/bin/sh
awk '
BEGIN { row=0; fixup = -1; }
{
    before[row] = $0;
    gsub("2016/01/30 14:52:51: ", "", $0);
    if ( $0 != before[row] ) {
            fixup = row;
    }
    after[row++] = $0;
}
END {
    if (fixup >= 0) {
            after[fixup] = before[fixup];
    }
    for (n = 0; n < row; ++n) {
            print after[n];
    }
}
'

(2つのアレイを使用することはあまり効率的ではありませんが、beforeアレイを使用しないよりもさらに修正が簡単です)。

入力ファイル()を生成してfoo.inこれをテストしました。

1awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
2awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
3awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

次のようにスクリプトを実行します。

./foo <foo.in

そして得た

1awk '{gsub(//,"",$1);print}'
2awk '{gsub(//,"",$1);print}'
3awk '{gsub(//,"",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

おすすめ記事