簡體   English   中英

使用 bash shell 命令從另一個文件的列中替換文件中的值列的最快方法?

[英]Fastest way to replace columns of values within a file from columns of another file using bash shell command?

我正在嘗試通過從另一個值的列替換文件中的某些列值來完成一項簡單的工作,例如,我想用 file2 中的值替換 file1 中的兩列,比如說第 2 列和第 3 列。 所以預期的 output 將類似於: File3

文件1:

1 2 3 4
1 2 3 4
1 2 3 4

文件2:

5 6
5 6
5 6

文件3:

1 5 6 4
1 5 6 4
1 5 6 4

所以我目前的解決方案是使用 awk:

awk 'NR==FNR{a[NR]=$1;b[NR]=$2;next}{$2=a[FNR];$3=b[FNR]}1' File2 File1>File3

但我覺得如果我有一百萬行,它可能太慢了,因為每次我必須逐行掃描文件 1 和文件 2 以恢復或調用我在 awk 中創建的 arrays。 由於 File1 和 File2 的長度相似,我想知道是否可以做一些事情,比如將 File2 的值作為變量傳遞並直接替換它。 我嘗試過類似的事情:

F2_col1=`awk '{print $1}' File2`
F2_col2=`awk '{print $2}' File2`
awk -v F2_col_v1=$F2_col1 -v F2_col_v2=$F2_col2 '{$2=F2_col_v1;$3=F2_col_v2;print }'File1 >File3

但它會引發一個錯誤,說無法讀取文件 5。似乎 awk 試圖將 File2 的值作為單個文件讀取? 我想知道如何正確地做到這一點? 或者有沒有其他更快的方法來做到這一點。 我只關心計算時間,所以歡迎任何建議(不限於 awk)。

由於您指定它不必嚴格為awk ,我的建議是合並文件並僅打印選定的列:

file1=$1
file2=$2

paste "${file1}" "${file2}" | awk '{print $1" "$5" "$6" "$4}' >file3.txt

您的awk變量未引用,例如

awk -v F2_col_v1="$F2_col1" -v F2_col_v2="$F2_col2" ...

第一個 shell 變量擴展為-v F2_col_v1=5 5 5 但我不知道將這些變量與awk結合起來的方法是有意義的。

常見的cutpaste方法是

paste -d' ' <(cut -d' ' -f1 File1) file2 <(cut -d' ' -f4 File1) > File3

如果兩個輸入文件中的行數相同。

您必須測試這兩種變體並停止時間。 如果awk更快,我不會感到驚訝,因為File1被讀取了兩次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM