sed

sed

次のようなファイルがあります:

171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,

タイムスタンプ付きの行 (つまり、行の先頭からカンマまで) を保持し、他の行 (つまり、行の先頭からカンマまで)171023 03014426 1234 XXXX XXXXXXXXを保持して、変更を同じファイルに書き込む必要があります。error code: 123

出力:

171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123

どうやってやるの?

答え1

あなたの質問を理解すると、あなたはこれを望んでいる

171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,

こうなります:

171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123

これを行うには多くの方法があるため、希望する方法を選択してください。

sed

$ sed 's/\(error code:[[:blank:]][[:digit:]]*\),.*/\1/' input.txt                                     
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123

元のファイルに変更を加えたい場合にはinput.txtsed -i単にsed

awk

$ awk -F ',' '/^error code/{$0=$1};1' input.txt                                                       
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123

このアプローチにより、カンマは列 (awk では「フィールド」) の区切り文字として扱われるため、ここでは基本的にerror codeテキストで始まる行を見つけて、元の行を列のみに置き換えます$1。この場合、カンマの前にあるすべてのもの、つまり になりますerror code: 123

awkテキスト内編集 (ほとんどのバージョン) はできませんsed -iが、常に新しいファイルに出力し、古いファイルを新しいファイルに置き換えることができます。

awk -F ',' '/^error code/{$0=$1};1' input.txt > new_data.txt && mv new_data.txt input.txt 

純粋な強打

#!/usr/bin/env bash

# make temp file for writing stuff
temp=$(mktemp)

# read input file, make necessary changes, write to temp file
while IFS= read -r line;
do
    case $line in
        "error code:"*) printf "%s\n" "${line%%,*}" >> "$temp";;
        *) printf "%s\n" "$line" >> "$temp";;
    esac
done < "$1"
mv  "$temp" "$1"

テスト走行:

$ # before 
$ cat input.txt                                                                                       
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
$ # after
$ ./edit_error_codes.sh input.txt                                                                     
$ cat input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123

答え2

削除したくない行にカンマがなく、常に最初のカンマとそれ以降のすべてを削除したい場合は、非常に簡単な式を使用できます。

$ sed 's/,.*//' file
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
  • s/old/new/oldと置換するnew
  • .*任意の数の任意の文字

ファイルをその場で編集するには、sedのインプレースオプションを使用します。これは です-i。 の後にバックアップファイルのサフィックスが追加されると-i、同じディレクトリにその拡張子を持つ元のファイルのバックアップが自動的に書き込まれます。たとえば、

sed -i 's/,.*//' file

file変更されたストリームで上書きしますが、

sed -i.orig 's/,.*//' file

変更されたストリームを書き込み、元の内容を含むfile新しいファイルを書き込みます。file.orig

答え3

簡単なcutコマンドを使用して、必要な操作を実行できます。

cut -d"," -f1 input.txt

同じファイルに書き戻します。

cut -d"," -f1 input.txt | tee input.txt

関連情報