Shell 基于另一个文件更改文件信息

Shell 基于另一个文件更改文件信息,shell,awk,sed,grep,Shell,Awk,Sed,Grep,我有两个简单的文本文件: 第一个是参考文件,看起来是这样的——每行的第一个字母是重要的 G A C A G A 第二个是这样的: G G G G A A A A A A A G 2 2 0 0 0 1 第二个文件是我想根据第一个文件的信息更改的文件 例如,如果前两列包含字母G,即G,因为该字母是我的引用文件中的第一个字母,所以我想将这两列转换为一列,编号为2(表示有两个G)。第三列和第四列也有两个G,因此我想将这两列也转换为一个编号为2的列 在第二个文件的最后一行中,前两列有字母A和A,

我有两个简单的文本文件:

第一个是参考文件,看起来是这样的——每行的第一个字母是重要的

G A
C A
G A
第二个是这样的:

G G G G
A A A A
A A A G
2 2
0 0 
0 1
第二个文件是我想根据第一个文件的信息更改的文件

例如,如果前两列包含字母G,即
G
,因为该字母是我的引用文件中的第一个字母,所以我想将这两列转换为一列,编号为
2
(表示有两个G)。第三列和第四列也有两个
G
,因此我想将这两列也转换为一个编号为
2
的列

在第二个文件的最后一行中,前两列有字母
A
A
,但由于我的参考文件最后一行的第一个字母是A
G
,我想将这两列转换为数字0(表示有零个
G
-引用文件的第一个字母是我正在计算的字母)。第三列和第四列有
A
G
,因为有一个
G
,所以我想要两个将这两列转换为一个数字为1的列

转换后的文件应如下所示:

G G G G
A A A A
A A A G
2 2
0 0 
0 1
如果有任何帮助,我将不胜感激。一次处理两个文件并进行这样的转换不属于我的编程技能范围


注意:我的真实文件包含字母A、C、G和T假设第一个文件名为
ref
,第二个文件名为
data

$ awk 'NR==FNR{a[FNR]=$1; next} {print (a[FNR]==$1)+(a[FNR]==$2), (a[FNR]==$3)+(a[FNR]==$4)}' ref data
2 2
0 0
0 1
说明:

  • NR==FNR{a[FNR]=1;next}

    NR
    是到目前为止已读入的行数,
    FNR
    是从当前文件读入的行数。因此,当
    NR==FNR
    时,我们知道
    awk
    仍在处理第一个文件。在这种情况下,我们将行上的第一个字母保存在数组
    a
    中。
    next
    语句告诉
    awk
    跳过其余命令并转到下一行

  • 打印(a[FNR]==1)+(a[FNR]==2),(a[FNR]==3)+(a[FNR]==4)

    由于上面的
    next
    命令,只有在处理第二个文件时才会执行此命令。如果是这样,我们会打印出前两列中有多少字母与
    ref
    文件中相应行中的第一个字母相匹配,然后对第三列和第四列执行相同的操作

处理丢失的数据 假设缺少的数据由
0
表示。例如,以该数据文件为例:

$ cat data2
G G G G
0 0 C A
A G 0 0
以下awk脚本已扩展以显示缺少数据的“?”:

$ awk 'NR==FNR{a[FNR]=$1; next} {print ($1==0)?"?":(a[FNR]==$1)+(a[FNR]==$2), ($3==0)?"?":(a[FNR]==$3)+(a[FNR]==$4)}' ref data2
2 2
? 1
1 ?
(与以前一样使用了相同的
ref
文件。)

处理任意数量的列
awk'NR==FNR{a[FNR]=$1;next}{s=”“;用于(i=1;iI刚找到一些带零的列,这是我的
数据
文件中缺少的数据。是否有可能在awk在列中找到零时放置
符号?@user3047092是的,但给我一个输入示例。发生这种情况时,所有列都是零吗?或者是否有可能在3和4小时时列1和2都是零ave数据,等等?例如,我在ref文件中添加了一行:
T
G
,也在数据文件中添加了一行:
0 T G
。当我运行awk脚本时,我得到
0
1
。但我希望得到一个
符号,表示缺少数据,以及一个
1
,这是基于o的正确数字n我的ref文件。谢谢。我使用新脚本得到这个错误:awk:syntax error在源代码行1上下文是NR==FNR{a[FNR]=$1;next}{print>>>$1===@user3047092我刚刚从答案复制并粘贴了它,它对我有效(使用Linux)。你是在Mac上吗?另外,我刚刚更新了行以添加一些参数,这可能对非GNU awk有帮助。如果这不能解决问题,我需要查看完整的格式化错误消息,该消息将显示awk出现问题的字符。