我有一个数据文件 ( $file1
),其中每个人包含两行数据。我需要散布来自另一个数据文件的第三行数据($file2
)。所以我的输入看起来像:
>cat $file1
bob 1 1 0
bob 1 0 1
alan 0 0 1
alan 0 1 1
>cat $file2
bob a a b
alan a c a
所以期望的结果是:
>cat $file3
bob 1 1 0
bob 1 0 1
bob a a b
alan 0 0 1
alan 0 1 1
alan a c a
如果我只需要散布其他每一行,我会paste
像这样使用:
>paste '-d\n' $file1 $file2
实现这一目标的最佳工具是什么?我在用zsh
。
答案1
只是:
paste -d '\n' -- - - "$file2" < "$file1"
(前提$file2
是不是-
)。
或者使用 GNU sed
,前提是$file2
(变量内容、文件名)不包含换行符,也不以空格或制表符开头:
sed "2~2R$file2" "$file1" < "$file2"
使用awk
(前提$file1
是不包含=
字符(或者至少如果包含字符,则其前面的部分不是可接受的 awk 变量名称)):
export file2
awk '{print}
NR % 2 == 0 {if ((getline l < ENVIRON["file2"]) > 0) print l}
' "$file1"
答案2
如果你不需要维护你可以做的人的秩序cat $file1 $file2 | sort
答案3
其他与awk
awk '
FNR==NR{
A[$1]=$0
next
}
1
!(NR%2){
print A[$1]
}
' file2 file1
或者如果两个文件都正确排序(正如我们使用 can paste
)更简单:
awk '
1
!(NR%2){
getline <"file1"
print
}
' file1