awk / sedを使用して1行ずつファイルを操作中にエラーが発生しました。

awk / sedを使用して1行ずつファイルを操作中にエラーが発生しました。

" 1"ファイルの各行の末尾に文字列を追加する必要があります。次の2つのコマンドを実行すると、空のファイルが生成されます。

awk '{ print $0 " 1" }' < file.txt > file.txt 

使用sed

sed 's/$/ 1/' file.txt > file.txt

ここで試してみると、どのようなエラーが発生しますか?アドバイスしてもらえますか? Mac端末でこのコマンドを実行しています。

答え1

GNUsedソリューションにはインライン編集が必要です-i

sed -i 's/$/ 1/' file.txt

(BSDの場合sed必要sed -i ''

awkこの問題を解決するには一時ファイルを使用する必要があります。

awk '{ print $0 " 1" }' file.txt > tmp && mv tmp file.txt

実際にはsed一時ファイルも生成されますが、-iファイルが処理されることもあります。

問題は次のとおりですawk '{ print $0 " 1" }' < file.txt > file.txt

リダイレクトはawk制御権を取得する前に行われます。> file.txtファイルが切り捨てられます。端末でこれを試してください。

>file

fileファイルに以前の内容があってもサイズは0になります。したがって、awkこのファイルからデータを読み取ることはできません。のような問題ですsed

\r改行文字を使用した最終的な解決策:

perl -pi -e 's/\r\n|\n|\r/ 1\n/g' file.txt

関連情報