【问题标题】:Having a problem with awk to receiving string variable from xargsawk 从 xargs 接收字符串变量时遇到问题
【发布时间】:2021-09-09 05:42:17
【问题描述】:

ls subset/*.txt | cut -d "/" -f 2 | cut -d "." -f 1 | xargs -i awk '$2 == {} {print $3,$4 > $2}' data.txt

有人可以帮助我为什么这行不通吗?

我在子目录中有一个文件列表,我想使用这些文件名。 ls subset/*.txt | cut -d "/" -f 2 | cut -d "." -f 1 这部分说明我已经成功分离了文件名。

然后我想在 data.txt 中查找 $2 与文件名匹配的行,并将字段 $3 和 $4 保存在文件名 $2 下。

我一直在尝试不同的版本,但没有一个能达到我想要的效果。我想我对 xargs -i 选项有些不了解,但我就是想不通。有人可以帮忙吗?

可以说,我的文件将在子目录中,

file1.txt

file2.txt

file3.txt

我的 data.txt 包含数千个文件的数据,其中只有子集在子集目录中。 data.txt 中的每一行都是一个记录文件:例如这样。

xxxx 文件2 34 45 xxxx xxxx xxxx xxxx

xxxx 文件1 54 30 xxxx xxx xxxx xxx

vvvd file2 23 30 xfxx flkd sdlfkj dfs

我只想分别保存字段 3 和 4,以便输出如下所示。

file2.txt 的内容:

34 45

23 30

file1.txt 的内容:

54 30

【问题讨论】:

标签: awk xargs


【解决方案1】:

您的 xargs 命令不起作用,因为它正在将 awk 命令中的 {} 替换为它正在使用的文本,因此在该上下文中,该文本似乎是从未设置过的 awk 变量名称,因此为空当您希望它们成为字符串时。要将文本视为字符串,您需要将 {} 放在双引号内。看:

$ printf 'foo\n' | xargs -i awk 'BEGIN{ print {} }'

$ printf 'foo\n' | xargs -i awk 'BEGIN{ print "{}" }'
foo

第一个命令相当于尝试打印名为 foo 的未填充变量的值:

awk 'BEGIN{ print foo }'

第二个是你想要的,打印文字字符串"foo":

awk 'BEGIN{ print "foo" }

如果没有示例输入/输出,这是一个猜测,但看起来这可能是您想要做的:

awk '
BEGIN {
    for (; ARGC>2; ARGC--) {
        fname = ARGV[ARGC-1]
        delete ARGV[ARGC-1]
        sub(".*/","",fname)
        sub("\.[^.]+$","",fname)
        fnames[fname]
    }    
}
$2 in fnames { print $3, $4 >> $2; close($2) }
' data.txt subset/*.txt

这只是对 awk 的 1 次调用,不需要 lsxargs 等,除非您在 subset 下有太多文件,以至于超出了 shell 的最大参数长度。

【讨论】:

  • 另一个出色的“Ed”答案。我只是在等待“每当我看到foo | bar | baz | awk '{...}',答案通常是——为什么不从awk 开始?”你又搞定了..
  • 您好,感谢您的代码。我不是一个认真的编码员哈哈。只是想拼凑我所知道的。我会做我的研究,但有人可以向我解释这段代码吗?尤其是这部分:for (; ARGC>2; ARGC--)?是否仔细检查了这两个文件是否正在被读取?
  • 不,它只是遍历作为参数传递的文件名列表,并将除第一个文件名 (data.txt) 之外的所有文件存储在 fnames[] 哈希中,它们可以与 @987654337 进行比较@s 来自 data.txt 稍后。循环还会将它们从参数列表中删除,因此脚本不会尝试读取它们。如果阅读手册页还不够,您可以随时添加打印语句来转储变量等,看看它在做什么。
猜你喜欢
  • 2017-02-09
  • 2020-05-25
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2013-05-25
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多