我有2个文件。
文件1具有以下数据:
def!:abcabc:abc123
sdf!:skdfkd:asd432
jkl!:kalsfs:kak323
文件2有这样的数据:
def!:hi123
fjs!:aaaaa123
bab!:kfksfksasdf123
输出应为:
abcabc:abc123:hi123
我编写了以下单行程,但是我正在使用2个数组:
awk -F ':' -v OFS=':' 'FNR==NR{a[$1] = $0;f[$1] = $2;next} ($1 in a) {print $2,$3,f[$1]}' file2 file1 > output
请解释简化版本的工作原理。
此致
Andrew Smith
答案 0 :(得分:2)
如果您对使用GNU sort和GNU join而不是awk的解决方案感到满意,可以这样做:
join -t: -o 1.2,1.3,2.2 <( sort -t: file1 ) <( sort -t: file2 )
这假定file1
和file2
未排序,因此使用sort
。
-t
用于设置join
和sort
-o
选项join
选择哪个文件的哪些部分用于输出,加入的信息页面(info join
)有更多信息答案 1 :(得分:1)
了解脚本中a[]
的用途:
awk -F ':' -v OFS=':' 'FNR==NR{a[$1] = $0;f[$1] = $2;next} ($1 in a) {print $2,$3,f[$1]}' file2 file1 > output
您将$0
保存在a[$1]
中,以便将第一个文件的全部内容存储在内存中,但之后您永远不会对$0
中存储的a[]
值执行任何操作}}。您对a[]
所做的一切都是测试$1
是否在其中$1 in a
,但每次a[$1]=$0
f[$1]=$2
时,您$1 in a
也会$1 in f
所以a[]
awk -F ':' -v OFS=':' 'FNR==NR{f[$1] = $2;next} ($1 in f) {print $2,$3,f[$1]}' file2 file1 > output
1}}是真的,$1 in f
也必须是真的,那就是你实际使用print语句中内容的数组。所以你可以摆脱FS
而只是做:
OFS
它的工作方式与原始脚本完全相同。您不需要awk 'BEGIN{FS=OFS=":"} FNR==NR{f[$1]=$2;next} $1 in f{print $2,$3,f[$1]}' file2 file1 > output
周围的parens,只要您需要2个变量(例如Sub dural()
ActiveSheet.Cells.NumberFormat = "General"
End Sub
和div
)来获得相同的值,最好将它们一起设置为该值,而不是单独使用所以你的脚本可以更加惯用地写成:
var marker= new google.maps.Marker({
position: new google.maps.LatLng(30,30)
});