Thay thế tất cả các giá trị trong một cột thành 1


8

Tôi có nhiều tệp văn bản chứa 12 dòng và 3 cột.

Thí dụ:

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 

Tôi muốn đặt tất cả các giá trị của cột thứ ba thành 1 trong tất cả các dòng.

Đầu ra sẽ trông như thế này:

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  

Có ai biết một lệnh có thể giải quyết vấn đề này?

Câu trả lời:


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

1
Lệnh này in ra dòng đầu tiên trong tệp văn bản chính xác trong thiết bị đầu cuối, nhưng không thực hiện thay đổi trong tệp ...
user203269

chuyển hướng đầu ra sang một tệp khácawk '{print $1, $2, "1"}' inputfile > newfile
user1700494 2/12/2016

Cảm ơn! Nó hoạt động nhưng chỉ viết ra dòng đầu tiên, cột 1, 2 và 3. Tôi muốn viết ra tất cả 12 dòng theo cách tương tự :)
user203269

12

thử

ôi

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 sẽ đặt trường thứ ba thành 1

sed (ở đây là GNU hoặc busybox sedvới -itùy chọn chỉnh sửa tại chỗ)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$là một chuỗi từ 0đến 9.đến cuối dòng.

sed (đánh gôn 4 byte)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ bất kỳ char nào ngoài không gian, cho đến hết dòng.

3
Hãy để codegolf :: sed 's/[^ ]*$/1/'->
Ipor Sircer

Cảm ơn bạn rất nhiều! :) Awk dường như hoạt động, ngoại trừ dòng đầu tiên: 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 dòng đầu tiên in giá trị thứ 2 và thứ 3 hai lần?
dùng203269

@ user203269 phiên bản awk hoạt động tốt với tôi (mặc dù có vấn đề về hình thức)
Archemar

3
awkđánh gôn: awk \$3=1(POSIX nhưng sẽ không hoạt động với awk từ những năm 70 như được tìm thấy trong / bin trên Solaris)
Stéphane Chazelas

awkgiải pháp đó thực sự rất tuyệt .... bạn có thể giải thích được không
mazs

5

Các dòng trong đầu ra dự kiến ​​của bạn dường như kết thúc bằng hai ký tự khoảng trắng và có các trường được phân tách bằng một tab và một ký tự khoảng trắng.

Nếu đó thực sự là những gì bạn muốn, thì bạn cần:

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

Hoặc với sed:

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

Tại sao khoảng trắng sau 1?
123

@ 123, như tôi đã nói, trong đầu ra dự kiến ​​của OP, mỗi dòng kết thúc bằng hai ký tự khoảng trắng.
Stéphane Chazelas

Đọc sai bạn nghĩ các trường được phân tách bằng hai khoảng trắng và một tab. lỗi của tôi.
123

Xin chào Stephane, awk này thực hiện đúng ba giá trị đầu tiên, sau đó nó xóa cột1 dòng 2 và tiếp tục mà không thực hiện thay đổi ..
user203269

1
@ user203269, trước tiên hãy chuyển đổi tệp của bạn từ MS-DOS sang Unix.
Stéphane Chazelas

3

Đơn giản với GNU sed, sử dụng -iđể thay thế văn bản trực tiếp trong tệp:

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

Các cột được kết hợp bởi các nhóm regex trong ngoặc đơn, tái sử dụng chúng với \1\2và sau đó sử dụng một "1" để thay thế cho nhóm cuối cùng.

Trong trường hợp sử dụng này, giải pháp được đề xuất sử dụng awkcũng tốt và ngắn.


2

điều này sẽ làm công việc:

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

tập tin mèo | cắt -d '' -f-2 | sed 's / $ / 1 /' 646 6 0.5 1 in ra một dòng (dòng cuối cùng) trong thiết bị đầu cuối, nhưng không thay đổi file.txt ...
user203269

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

Bạn có thể vui lòng chỉnh sửa bài viết của mình để bao gồm nhiều ngữ cảnh hơn về lý do tại sao bạn cảm thấy đây là giải pháp?
kemotep
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.