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
,但由于我的参考文件最后一行的第一个字母是AG
,我想将这两列转换为数字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出现问题的字符。