Linux
如何從大數據文件中查找索引值的值?
我有一個數據文件(範例中為 data_array.txt)和索引文件 index.txt,我想在其中從索引文件中具有相同 ID 的數據文件中提取數據並儲存到一個新文件中,輸出.txt。我還想將 NA 放在 Out.txt 中,用於那些在數據文件中沒有值的 ID。我知道如何為一欄做到這一點。但我的數據有 1000 多列(從 1 到 1344)。我希望你幫我寫一個可以更快完成的腳本。我的數據文件、索引 ID 和建議輸出如下。
data_array.txt
Id 1 2 3 . . 1344 1 10 20 30 . . -1 2 20 30 40 . . -2 3 30 40 50 . . -3 4 40 50 60 . . -4 6 60 60 70 . . -5 8 80 70 80 . . -6 10 100 80 90 . . -7
索引.txt
Id 1 2 8 9 10
所需的輸出是
輸出.txt
Id 1 2 3 . . 1344 1 10 20 30 . . -1 2 20 30 40 . . -2 8 80 70 80 . . -6 9 NA NA NA NA 10 100 80 90 . . -7
這是我想出的一個小 awk 腳本,它應該搜尋與您的索引匹配的行。只需將它放在一個文件中(例如lookup.awk)並按如下方式執行:
查找.awk
BEGIN { # read lookup variables from the commandline and put them in an array split(indexes, index_array, " "); } NR=1 { # set the number of columns to the amount that's on the first line (only used for NA printing) nr_of_fields = NF-1; } # For every line in your data file do the following { # check if the first field matches a value in the index array for (var in index_array) { if ($1 == index_array[var]) { # when a match is found print the line and remove the value from the index array print $0; delete index_array[var]; next; } } } END { # after all matching lines are found, print "NA" lines for the indexes that are still in the array for (var in index_array) { printf index_array[var]; for (i=1; i<nr_of_fields; i++) { printf " NA"; } printf "\n"; } }
然後你可以像這樣執行它:
$ awk -f ./lookup.awk -v indexes="1 2 3 4 5 6 7 8 9 10" data.txt | sort -n 1 10 20 30 . . -1 2 20 30 40 . . -2 3 30 40 50 . . -3 4 40 50 60 . . -4 5 NA NA NA NA NA 6 60 60 70 . . -5 7 NA NA NA NA NA 8 80 70 80 . . -6 9 NA NA NA NA NA 10 100 80 90 . . -7
請注意,這個 awk 腳本不會以某種順序輸出值作為您的索引(這將需要一些額外的邏輯)。