我想知道一种有效组合两个文件的方法。我想在FileB
的偶数行之后仅连接FileA
的偶数行。我认为可以用sed或awk轻松完成。任何帮助表示赞赏。
FILEA:
A1
A2
A3
A4
A5
A6
.
.
FILEB:
B1
B2
B3
B4
B5
B6
.
.
输出:
A1
A2
B2
A3
A4
B4
A5
.
答案 0 :(得分:2)
awk
救援!
awk 'NR==FNR {b[NR]=$0; next} 1; !(FNR%2){print b[FNR]}' fileB fileA
如果文件很大,您可以通过仅存储fileB的打印行来剪切数组大小。
答案 1 :(得分:2)
这是一种避免将其中一个文件存储在内存中的方法:
awk -v f=FileB '{print} NR%2==0 {getline<f; getline<f; print}' FileA
-v f=FileB
这会创建一个awk变量f
,其中包含FileB的名称。
{print}
这将打印从FileA读取的每一行。
NR%2==0 {getline<f; getline<f; print}
如果我们在偶数行上,意思是NR%2==0
,那么我们从FileB读取两行并打印第二行。
$ awk -v f=FileB '{print} NR%2 == 0{getline<f; getline <f; print}' FileA
A1
A2
B2
A3
A4
B4
A5
A6
B6
Awk允许使用神秘的简写符号执行打印:
awk -v f=FileB '1; NR%2{next} {getline<f; getline <f} 1' FileA
此处,1
是条件,其评估为true。由于未指定操作,因此执行默认操作即打印该行。
答案 2 :(得分:2)
您可以合并paste
,sed和进程替换:
$ paste -d '\n' <(sed '2~2d' fileA) <(sed '1~2d' fileA) <(sed '1~2d' fileB)
A1
A2
B2
A3
A4
B4
A5
A6
B6
说明:
paste -d '\n'
逐行粘贴文件,由换行符分隔,有效地交错它们sed '2~2d' fileA
打印fileA
的奇数行(通过删除偶数行)sed '1~2d' fileA
打印fileA
sed '1~2d' fileB
打印fileB
答案 3 :(得分:2)
这可能适合你(GNU sed);
sed '1~2d' fileB | sed '2~2R /dev/stdin' fileA
在偶数行上过滤fileB,并通过管道将结果文件传递给sed的第二次调用,将这些行仅附加到fileA中的偶数行。