web-dev-qa-db-ja.com

1つの列のすべての値を1に置き換えます

12行3列のテキストファイルが複数あります。

例:

2       6    0.74  
42      6    0.58  
80      6    0  
112     6    0.24  
132     6    1  
216     6    0.7  
342     6    0  
390     6    0.21  
432     6    0.56  
466     6    0.75  
524     6    0.6  
646     6    0.9 

すべての行で3番目の列のすべての値を1に設定したい。

出力は次のようになります。

2    6   1  
42   6   1  
80   6   1  
112  6   1  
132  6   1  
216  6   1  
342  6   1  
390  6   1  
432  6   1  
466  6   1  
524  6   1  
646  6   1  

この問題を解決できるコマンドを知っている人はいますか?

8
user203269
awk '{print $1, $2, "1"}' inputfile
16
user1700494

試す

awk

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1は3番目のフィールドを1に設定します

sed(ここでGNUまたはbusybox sedとその-iオプションをインプレース編集して)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$は、0から9および.から行末までのシーケンスです。

sed(4バイトのゴルフ)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$行末までスペース以外の任意の文字。
12
Archemar

予想される出力の行は2つのスペース文字で終了しているようで、1つのタブと1つのスペース文字で区切られたフィールドがあります。

それが本当にあなたが望むものであるなら、あなたは必要になるでしょう:

awk -v 'OFS=\t ' '$3="1  "' < infile > outfile

またはsedを使用:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile
5

単にGNU sedを使用し、-iを使用してファイル内のテキストを直接置換します。

sed -i 's:\(.*\s\)\(.*\s\)\(.*\):\1\21:g' textfile

かっこ内の列は正規表現グループによって照合され、\1および\2で再利用し、最後のグループを置き換えるために「1」を使用します。

この使用例では、awkを使用して提案された解決策も適切で簡潔です。

3
mazs

これは仕事をします:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
2