当前位置: 首页 > 知识库问答 >
问题:

awk解决方案,用于按列搜索任何字符的第一个实例(但只有一个!)

曾飞沉
2023-03-14

我有一个(以前排序的)文本文件,由破折号-或单个字母字符组成。我将非常感谢任何帮助,以更好地理解适当的awk语法,以便在文本文件的每一列中移动,并且如果存在非破折号字符,则仅保留每行中的第一个非破折号字符,或者如果不存在字母字符,则保留该破折号字符...无论哪种情况,结果都是单行文本。文件总是以这样一种方式格式化,即每行具有相同的列数,并且总是首选第一个非破折号字符,无论“较低”行中是否存在其他字母字符。

需要澄清的两个示例:给定此文本文件:

# printf 't---k-\ncha---\n--nn--\n--ab-s\n'

t---k-
cha---
--nn--
--ab-s

程序将从第一列开始,因为第一个字符不是破折号,它将保留一个t。然后我们进入下一列,其中第一行信息是破折号,因此进入第二行,其中选择了h。然后前进到第三列,并移动到第三行以选择n字符等。要报告的预期字符串是:

谢谢

在第二个例子中,我们有一个非常相似的文本排列,只有一个例外:

#printf 't-----\ncha---\n--nn--\n--ab-s\n'

t-----
cha---
--nn--
--ab-s

请注意,在第二个示例的第四列中没有字母字符。因为不存在这样的字符,我们将在该位置返回破折号。因此,预期产出将是:

than-s

这篇文章强调了一种类似于我试图实现的方法,这篇文章同样提供了一种通过numpy实现的解决方案,但我相信它们都需要适用于整数的函数,而我有一个由字母字符组成的数据集。这篇文章类似地解释了一种使用awk以列方式应用函数的方法,这与我所追求的更接近,正如另一篇awk文章一样。在我看来,我所追求的awk方法同样需要我声明一种列式方法,我认为在函数的开头已经说明了这一点:

awk '{for (i=1;i<=NF;i++){

... 我陷入困境的地方是试图识别函数的下一个参数,我认为我在寻找某种类型的if/else语句。这就是我希望得到进一步澄清的部分。

也许解决方案不需要通过awk来完成——我当然对依赖任何语言的其他策略持开放态度,所以如果Python、Perl或其他策略显然是更合适的语言,谢谢你的教育。

谢谢你的考虑

共有2个答案

邹时铭
2023-03-14

您可以使用此gnu-awk解决方案:

awk '
BEGIN{FS=""}
{
   for (i=1; i<=NF; ++i)
      a[i]=a[i] $i
}
END {
   s = ""
   for (i=1; i in a; ++i)
      s = s gensub(/^((-)+|-*([^-]).*)$/, "\\2\\3", "1", a[i])
   print s
}' file
吕昀
2023-03-14

在每个Unix设备上的任何shell中使用任何awk:

$ cat tst.awk
{
    numChars = length($0)
    for (i=1; i<=numChars; i++) {
        if ( chars[i] ~ /^-?$/ ) {
            chars[i] = substr($0,i,1)
        }
    }
}
END {
    for (i=1; i<=numChars; i++) {
        printf "%s%s", chars[i], (i<numChars ? "" : ORS)
    }
}
$ awk -f tst.awk file1
thanks
$ awk -f tst.awk file2
than-s
 类似资料:
  • 以下是对不熟悉此问题的人的问题声明: 给定一个二维板和一个单词,找出这个单词是否存在于网格中。这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。 解决方案2 现在,据我所知,随着Java的短路,的两个版本都应该停止探索其他路径,如果任何子问题返回true。事实上,我可以评估的两个版本之间唯一的操作差异是,如果找到解决方案,第一个

  • 我有一个这样设置的索引: 几个重要字段的字段映射设置如下: 当我询问名字时。对字段进行分析后,它适用于至少包含两个字符的任何内容。例如,查询“Ra”将在名称字段中找到带有“Rafael”的文档。然而,当我查询“R”或“Rafael S”时,它不会返回任何结果。应该注意的是,在我们的查询中,空格被处理为“AND”操作符,而不是“OR”,因此基本上查询词被处理为“name contains[searc

  • 问题内容: 我想找到字符串中任何“特殊”字符首次出现的索引,如下所示: …除非那是无效的Python语法。当然,我可以编写一个模拟此行为的函数: 我也可以使用正则表达式,但两种解决方案似乎都有些过分。在Python中有什么“明智”的方法吗? 问题答案: 您可以将enumerate和next与生成器表达式一起使用,获取第一个匹配项,或者如果s中没有字符,则返回None: 如果没有匹配项,则可以将您想

  • 问题内容: 我有一个csv文件,数据显示如下 我正在尝试将第一列保存到新文件(不包含字段分隔符,然后从主csv文件中删除第一列以及第一个字段分隔符。 有任何想法吗? 到目前为止,这是我尝试过的 但这不起作用 问题答案: 假设您的原始CSV文件名为“ orig.csv”:

  • 我编写了这个小型测试应用程序来演示问题,即当用户按下键盘上的搜索按钮时,可搜索的活动未启动。 我一直在关注开发人员指南,但从我的网络搜索中,发现官方开发人员指南遗漏了一些要点。从我的SO搜索(没有帮助): > < li> 参考1:通过在清单的元素中添加标记来解决。我还查看了示例“用户字典”的清单(我不知道在网上哪里可以找到示例,或者我会链接到它)。这个标签在application元素中。 引用2:

  • 问题内容: 我编写了这个小型测试应用程序来演示该问题,即当用户按下键盘上的搜索按钮时,可搜索活动未启动。 我一直在遵循开发人员指南,但是从我的网络搜索中 发现,官方开发人员指南缺少一些要点。 从我的SO搜索(没有帮助): 参考1:通过在清单中的元素中添加标签来解决。我还查看了示例“用户字典”的清单(我不知道在哪里可以在线找到示例,或者我可以链接到它)。该标签在application元素中。 参考2