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


8

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  

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

回答:


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

1
このコマンドは、テキストファイルの最初の行を正しくターミナルに出力しますが、ファイルには変更を加えません...
user203269

出力を別のファイルにリダイレクトawk '{print $1, $2, "1"}' inputfile > newfile
user1700494

ありがとう!それは機能しますが、最初の行、列1、2、3のみを書き出します
。12

12

試す

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.]*$以下からのシーケンスである09し、.行の最後までは。

sed(ゴルフされた4バイト)

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

3
コードゴルフをしましょうsed 's/[^ ]*$/1/'::->
Ipor Sircer

どうもありがとうございます!:)最初の行を除いて、awkは機能しているようです:2 6 1 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最初の行は2番目と3番目の値を2回印刷しますか?
user203269 16

@ user203269 awkバージョンは私には問題なく動作します(ただし、フォーマットの問題はあります)
Archemar

3
awkgolfed:awk \$3=1(POSIXが、中/ Solaris上のbinに見られるように、70年代からのawkと動作しません)
ステファンChazelas

そのawk解決策は本当にクールです... plsを説明できますか
mazs

5

予想される出力の行は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

なぜ1の後にスペースがあるのですか?
2016

@ 123は、私が言ったように、OPの予想される出力では、すべての行が2つのスペース文字で終了します。
ステファンChazelas

フィールドは2つのスペースとタブで区切られていると誤解しました。私の悪い。
123

こんにちはステファンは、このawkは...それはcolumn1のライン2削除し、正しく最初の3つの値を行い、変更を加えずに続け
user203269

1
@ user203269、まずファイルをMS-DOSからUnixに変換します。
ステファンChazelas

3

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

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

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

この使用例では、使用を提案するソリューションawkも素晴らしく、短いものです。


2

これは仕事をします:

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

cat file.txt | カット-d '' -f-2 | sed 's / $ / 1 /' 646 6 0.5 1はターミナルに1行(最後の行)を出力しますが、file.txtは変更しません...
user203269

-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename

投稿を編集して、これが解決策だと思う理由についてより多くのコンテキストを含めていただけませんか?
ケモテプ2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.