Câu hỏi Viết một tập lệnh bash để đọc một tập tin văn bản các số thành các mảng, theo cột, trên Ubuntu


Tôi đang cố gắng viết một kịch bản bash nhỏ trên ubuntu 12.04 và có ít kinh nghiệm. Vấn đề nhỏ lẻ chuyển đổi một tập tin văn bản của các số thành mảng. Tôi cần tất cả các số đầu tiên, thứ hai, vv vào mảng riêng của nó bởi vì tôi sẽ chạy tính toán trên các số dựa trên cột nhiều hơn so với dòng nó đến từ. Tất cả các dòng là 5 số nguyên được phân cách bằng dấu cách với số dư ở cuối mỗi dòng. Là một mảng đa chiều có thể trong bash? Cảm ơn bạn!


1
2018-01-15 19:34


gốc


Bạn có thể đưa ra một ví dụ nhỏ về đầu vào bạn có và đầu ra bạn muốn không? Ngoài ra hiện nó thực sự cần phải được bash hoặc có thể một kịch bản quãng tám làm việc quá? - Presbitero
Tôi đánh giá cao bất kỳ sự giúp đỡ nào, nhưng hãy để tôi làm rõ vì tôi thực sự không ngụ ý rằng tôi CẦN các mảng hai chiều. Hãy nói rằng đây là tập tin văn bản của tôi: 1 2 3 4 5 dòng tiếp theo: 7 10 200 3 Tôi cần chúng được lưu trữ x (1) = 1, y (1) = 2 .... x (2) = 7, y ( 2) = 10 ... v.v. - JClar


Các câu trả lời:


Đây là một kịch bản, nó sẽ lưu trữ các số từ tệp văn bản thành hai mảng x và y Như bạn mong muốn,

#!/bin/bash

nl=$(cat "$1" | wc -l)
declare -a x
declare -a y
for i in $(seq 1 $nl)
do
    x[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $1}')"
    y[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $2}')"
done
#upto this point all the numbers from first and second column of the file are stored 
#into x and y respectively. Following lines will just print them again for you.
for it in $(seq 1 $nl)
do
    echo "${x[$it]} ${y[$it]}"
done

Đừng quên cho phép thực thi kịch bản.

chmod +x script.sh

Sử dụng

./script.sh numfile.txt

nơi tôi đang xem xét bạn sẽ lưu tập lệnh ở trên script.sh và tập tin văn bản của bạn chứa số là numfile.txt. Và cả hai đều nằm trong cùng một thư mục.


2
2018-01-21 11:11





Bash chỉ hỗ trợ các mảng một chiều, mặc dù có một chút giấy phép nhỏ bé mô phỏng các mảng đa chiều.

Tài liệu này chứa một ví dụ về mảng hai chiều. http://tldp.org/LDP/abs/html/arrays.html

Tôi tự hỏi liệu một ngôn ngữ khác có phù hợp với trường hợp sử dụng của bạn dễ dàng hơn không. Dường như bạn đang kéo dài giới hạn của những gì bash có thể làm, trong khi Python, Perl hoặc Ruby sẽ xử lý công việc này một cách dễ dàng. Tôi đoán công cụ bạn sẽ sử dụng cho "tính toán" tiếp theo của bạn sẽ xác định điều này đến một mức độ lớn.


1
2018-01-15 19:48





xin lỗi tôi đã không kiểm tra lại. Giải pháp đơn giản hơn tôi nghĩ vì các con số được phân tách bằng một khoảng trống với sự trở lại ở cuối dòng.

#!/bin/bash
COUNT=1
while read arr1[COUNT] arr2[COUNT] arr3[COUNT] arr4[COUNT] arr5[COUNT]
do
echo "next line"
 echo "${arr1[COUNT]}" 
 echo "${arr2[COUNT]}"
 echo "${arr3[COUNT]}"
 echo "${arr4[COUNT]}"
 echo "${arr5[COUNT]}"
COUNT=$[$COUNT +1]
done < /home/john/testloop.txt

-1
2018-01-21 15:23