2013-01-22 23 views
26

Tôi đang cố gắng lấy 22 ký tự đầu tiên từ một tệp dữ liệu unix. Đây là dữ liệu của tôi trông như sau.Cách lấy n ký tự đầu tiên trong tập tin dữ liệu unix

12 ký tự đầu tiên là cột 1 và 10 ký tự tiếp theo là cột thứ 2.

000000000001199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000002199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000003199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000004199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000005199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000006199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
+3

bạn có muốn 2 đầu tiên 2 ký tự của tệp hoặc 22 ký tự đầu tiên của mỗi dòng? Bạn nên sửa đổi câu hỏi nếu bạn muốn dữ liệu từ mỗi dòng. Khi được hỏi, 'dd' là công cụ bạn muốn nhận 22 ký tự đầu tiên từ tệp. –

Trả lời

56

Với cut:

$ cut -c-22 file 
0000000000011999980001 
0000000000021999980001 
0000000000031999980001 
0000000000041999980001 
0000000000051999980001 
0000000000061999980001 

Nếu tôi hiểu được những yêu cầu thứ hai bạn muốn chia 22 ký tự đầu tiên thành hai cột có chiều dài 10 và 12. sed là sự lựa chọn tốt nhất cho việc này:

$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file 
0000000000 011999980001 
0000000000 021999980001 
0000000000 031999980001 
0000000000 041999980001 
0000000000 051999980001 
0000000000 061999980001 
+0

-r làm gì? Tôi đã thử lệnh sed này nhưng tôi nhận được một thông báo lỗi rằng -r là một tùy chọn bất hợp pháp – interstellar

+0

@interstellar với GNU sed nó chuyển sang biểu thức chính quy mở rộng, tùy chọn tương đương cho BSD sed là -E. –

3

sudo_O đã cung cấp giải pháp cắt và thoải mái đẹp mắt, tôi vừa thêm một lớp lót một chiều:

awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file 

echo "000000000001199998000180000  DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' 
0000000000011999980001 

với char rỗng (nó phụ thuộc vào yêu cầu của bạn, bạn muốn bỏ qua các khoảng trống hoặc bạn muốn bao gồm và đếm chúng vào kết quả)

nếu khoảng trống cần được tính và hiển thị trong kết quả cũng như: (bạn không cần phải thay đổi cmd trên)

echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                   
0 0 0 0 00000001199998 

nếu bạn muốn bỏ qua những không gian: (nhanh chóng và bẩn)

echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                
0000000000011999980001