0

我有大约 100 个包含两列的文本文件,我想通过使用因子“A”将它们合并到 ac shell 脚本中的单个文件中。

例如,我的文件 A 看起来像这样
A B1
1 100
2 200
3 300
4 400

而文件 B 看起来像这样
A B2
1 100
2 200
3 300
4 400
5 300
6 400

我希望最终文件 C 看起来像这样:
A B1 B2
1 100 100
2 200 200
3 300 300
4 400 400
5 300
6 400


cat功能仅将文件彼此叠放并将它们粘贴到文件 C 中。我想将数据彼此相邻放置。这可能吗?

4

1 回答 1

0

为了满足您的确切规格,这将起作用。如果规格发生变化,您需要尝试一下,

paste -d' ' factorA factorB \
| awk 'NF==4||NF==3{print $1, $2, $3} NF==2{print$1, $2}' \
> factorC

# note, no spaces or tabs after each of the contintuation chars `\` at end of lines!

输出

$ cat factorC
A B1 B2 
1 100 100 
2 200 200 
3 300 300 
4 400 400 
5 300 
6 400

不确定如何bold通过 unix 管道获取标头“传输”。;->

回想一下,awk程序都有一个基本的底层结构,即

awk 'pattern{action}' file

因此pattern可以是一系列行、一个正则表达式、一个表达式 ( NF==4)、缺失或其他一些东西。

action是模式匹配时发生的情况。这是更传统的外观code

如果未pattern指定,则action适用于读取的所有行。如果没有action指定,但pattern匹配,则打印该行(不用多说)。

NF表示当前行中的 umberOf 字段,因此N只会处理具有 2 个字段的行(因子 B 中的尾随记录)。FNF==2

||是一个逻辑OR运算符,因此该块将只处理字段数为 的记录3 OR 4。希望这些print陈述是不言自明的。

,分隔符($1,$2,$3例如)是转换为 awk 的内部变量 的语法,OFSOutputFieldSeparator,可以像这样分配OFS="\t"(给出 tab char 的 OFS),或者在这种情况下,我们没有指定值,所以我们重新获得 OFS 的默认值,即空格 char ( " ")(没有引号!)

IHTH

于 2015-01-23T03:24:41.270 回答