次のようなファイルがあります:
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.txt
、sed -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