awk 一遍又一遍地打印同一行

问题描述 投票:0回答:1

新手寻求帮助

我有一个大文件(2000+行,1455列)

  • 我想迭代单元格并仅打印具有值的列/样本<200
  • 我必须转置我的表/数组还是有其他解决方案?
  • 一旦发现价值<200 I want it to print and move onto next column (so it doesn't print the same
  • 我还想包含我的标题

awk '{for (i=3; i<=NF; i++) if ($i<200) print} {next}'  table.txt

这就是我现在正在处理的 - 但它会迭代行(?)(从第 6 列 - 示例 1 开始),并在每次在该行中找到小于 200 的值时打印同一行,而不是直接转到打印后下一行。

awk '{for (i=3; i<=NF; i++) if ($i<200) print} {next}'  table.txt

table.txt(小选)

基因 targ_bp s_1 s_2 s_3
GNB1 217 53 102 1121
GNB1 202 1112 96 1226
GNB1 163 1141 1162 1181

使用当前代码输出:

| GNB1 | 217 | 217 53 | 53 102 | 102第1121章

| GNB1 | 217 | 217 53 | 53 102 | 102第1121章

| GNB1 | 202 | 202 1112 | 1112 96 | 96第1226章

想要的:

基因targ_bps_1s_2GNB121753102GNB1202111296
使用标题,删除全部> 200 的行和全部> 200 的列。
  • 希望我说得足够清楚。 0=)

awk printing conditional-statements
1个回答
0
投票

您可以迭代文件两次,首先获取列,然后打印列。一些事情:

# generate comma separated list of columns we want to print columns=$(awk ' { for (i=6; i<=NF; i++) # If the column was not handled, and it has value below 200 if (!(i in cols) && $i<200) # Add it as an index in cols variable cols[i]=1 } END{ for (i in cols) print i }' input.txt | # Join columns numbers using comma paste -sd, ) # Output only columns from input.txt. cut -d'\t' -f"$columns" input.txt # If you do not know if it's tab or space, you can squeeze first tr -s ' \t' '\t' < input.txt | cut -d$'\t' -f"$columns"


© www.soinside.com 2019 - 2024. All rights reserved.