Loops 对所有列重复awk和if语句
我有一个超过50列的文件,我只想输出所有列中最后一个字符等于1的字段。如何为所有列循环下面显示的if语句Loops 对所有列重复awk和if语句,loops,if-statement,awk,Loops,If Statement,Awk,我有一个超过50列的文件,我只想输出所有列中最后一个字符等于1的字段。如何为所有列循环下面显示的if语句 awk '{if(substr($0,length($0),1) == 1) print $0}' file_with_one_column.tsv 额外信息: (1) 分隔符:制表符 (2) 输出格式:与输入相同的列数(不包括最后一个字符!=1的字段)。i、 没有一行输出 (3) 所有列中的行数相同 (4) 问题:某些字段仅包含“.”字符 我在尝试使用for循环时遇到了这个问题 awk
awk '{if(substr($0,length($0),1) == 1) print $0}' file_with_one_column.tsv
额外信息:
(1) 分隔符:制表符
(2) 输出格式:与输入相同的列数(不包括最后一个字符!=1的字段)。i、 没有一行输出
(3) 所有列中的行数相同
(4) 问题:某些字段仅包含“.”字符
我在尝试使用for循环时遇到了这个问题
awk:1:意外字符'。
输入示例:
ENSG00000267601.1 ENSG00000256861.1 ENSG00000259953.2
DGCR8_H_2_2 . SAFB2_K_1_2
IGF2BP3_H_1_1 DDX6_K_1_2 LIN28B_H_1_2
NKRF_H_2_2 PPIL4_K_2_2 LIN28B_K_1_1
IGF2BP1_H_2_2 CDC40_H_1_2 LIN28B_K_2_1
POLR2G_H_2_2 IGF2BP3_H_1_2 .
期望输出:
ENSG00000267601.1 ENSG00000256861.1 ENSG00000259953.2
IGF2BP3_H_1_1 LIN28B_K_1_1
LIN28B_K_2_1
像这样:
awk '{for(i=1;i<=NF;i++){if(substr($i,length($i),1)=="1") print $i}}' file.tsv
awk'{for(i=1;i您尝试了哪个答案?我下面的答案很好我尝试了所有建议,但出现了错误(awk:1:意外字符“”)。您的建议只对第1列有效,但对其他列无效。当我尝试使用for循环时,我遇到了这个问题。您是如何尝试使用for
循环的?当您尝试使用awk执行数据时,这看起来像是一个错误。您调用awk的方式有些地方您没有与我们共享t(例如,可能您将其存储在变量中,然后尝试使用它,或者从python或DOS或其他方式调用它)因为脚本中没有任何东西会在编写时从shell调用时生成错误。如果您是从shell脚本调用它,那么错误就在shell脚本的其他地方,可能是缺少引号或调用awk之前的某个地方。复制/粘贴脚本以查看是否发现任何错误。如果然后创建一个最小的、完整的shell脚本(假设您正在使用shell脚本)来产生错误,并将其发布到您的问题中,以便我们可以帮助您调试它。我的一些列只包含“”字符。我收到了这个错误:awk:1:意外的字符“”。@Jan然后你复制/粘贴错误,或者你调用awk的方式有些东西你还没有与我们共享,因为脚本中没有任何东西会生成错误,如果它只是按照写的那样从shell调用。我已经尝试了最新的建议,并且我得到了想要的结果。谢谢@hek2mgl
#!/bin/bash
awk '{
found = 0
for(i=1;i<=NF;i++){
if(substr($i,length($i),1) == "1") {
printf "%s%s", (found?OFS:""), $i
found = 1
}
}
if(found) {
printf "%s", ORS
}
}' file.tsv