我有多個檔案,我想使用 shell 腳本按列合并,比如說檔案a.txt和檔案b.txt。檔案a.txt包含排序后的唯一值,第一列將用作參考值。
例子 :
# cat a.txt
001|johan
002|mike
003|adam
# cat b.txt
001|chu
001|stewart
002|lewis
002|jordan
003|lambert
003|johnson
003|smith
003|long
這兩個檔案將組合在一起以產生如下所示的輸出。
# cat c.txt
001|johan chu
001|johan stewart
002|mike lewis
002|mike jordan
003|adam lambert
003|adam johnson
003|adam smith
003|adam long
我嘗試使用簡單的迭代while do。
while read line
do
ids=`echo $line | awk -F"|" '{print $1}'`
fn=`grep $ids a.txt`
echo $fn"|"$line | awk -F"|" '{print $1"|"$2" "$4}'
done < b.txt > c.txt
但是如果我有數百萬行,這需要很多時間。
在MySQL我們可以很容易地使用JOIN子句來實作它。但我們需要先加載/插入它們。
更快的方法可能是使用paste命令,但據我所知,兩個檔案的總行數必須相等。好吧,我可以先調整a.txt。但是腳本運行時仍然需要很多時間。
也許有人有更好的方法。
uj5u.com熱心網友回復:
您可以將所有內容放在一個awk腳本中:
awk -F'|' '{if (NR==FNR) a[$1]=$2; else print $1 "|" a[$1] " " $2}' a.txt b.txt
001|johan chu
001|johan stewart
002|mike lewis
002|mike jordan
003|adam lambert
003|adam johnson
003|adam smith
003|adam long
uj5u.com熱心網友回復:
假設:
- 兩個檔案都按第一列排序
- 忽略對面檔案中不匹配的行
一個想法使用joinand sed(洗掉 2nd |):
join -t'|' -o 1.1,1.2,2.2 a.txt b.txt | sed -E 's/\|([^|]*$)/ \1/'
一個awk想法:
awk '
BEGIN { FS=OFS="|" }
FNR==NR { a[$1]=$2; next }
$1 in a { print $1,a[$1] " " $2 }
' a.txt b.txt
這兩個生成:
001|johan chu
001|johan stewart
002|mike lewis
002|mike jordan
003|adam lambert
003|adam johnson
003|adam smith
003|adam long
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/429496.html
