【问题标题】:using xargs as an argument for cut使用 xargs 作为 cut 的参数
【发布时间】:2014-09-26 08:13:14
【问题描述】:

假设我有一个文件 a.txt,其中包含一个单词,后跟一个数字,然后是换行符

and 3
now 2
for 2
something 7
completely 8
different 6

我需要从每个单词中选择第 n 个字符(由单词旁边的数字指定)

cat a.txt | cut -d' ' -f2 | xargs -i -n1 cut a.txt -c {}

我尝试了这个命令,它选择数字并使用 xargs 将它们放入 cut 的 -c 选项中,但 cut 命令在每一行都执行,而不是循环 a.txt(我曾预料到会发生这种情况) ) 我该如何解决这个问题?

编辑:由于似乎不清楚,我想从一个单词中选择一个字符。我需要选择的字符可以在单词旁边找到,例如: 和 3,会给我 d。我想对整个文件执行此操作,然后将形成一个单词:)

【问题讨论】:

  • 我真的不明白你在做什么。你想得到什么结果?请将其添加到您的问题中。
  • 如果我理解得很好,第二行应该返回“e”?
  • @CasimiretHippolyte 我的问题现在清楚了吗?抱歉,这是我第一次在这里提出问题,所以我真的不知道格式化是如何工作的。这里应该输出的词是'dooier'
  • 这更清楚了,感谢您的编辑。下一次,请包括您所需输出的示例。在你的问题中展示它而不是描述它。有关格式化的帮助,请参阅here

标签: bash unix cut cat xargs


【解决方案1】:

纯shell解决方案:

$ while read word num; do echo ${word:$((num-1)):1}; done < a.txt 
d
o
o
i
e
r

这是使用经典的 while; do ... ; done shell 循环和 read 内置函数。一般格式是

while read variable1 variable2 ... variableN; do something; done < input_file

这将遍历输入文件的每一行,将其拆分为您给定的尽可能多的变量。默认情况下,它将在空白处拆分,但您可以通过更改 $IFS 变量来更改它。如果您提供单个变量,则将保存整行,如果您提供更多,它将填充与您提供的变量一样多的变量,并将其余的保存在最后一个中。

在这个特定的循环中,我们将单词读入$word,将数字读入$num。一旦有了单词,我们就可以使用 shell 的字符串操作功能来提取子字符串。一般格式是

${string:start:length}

因此,${string:0:2} 将从变量 $string 中提取前两个字符。这里,变量是$word,开始是数字减一(从0开始计数),长度是一。结果是数字给定位置的单个字母。

【讨论】:

  • 啊,真漂亮。像这样的构造是我喜欢 shell 的原因。
【解决方案2】:

我建议你使用 awk:

awk '{print substr($1,$2,1)}' file

substr 采用第一个字段的子字符串,从第二个字段中包含的数字开始,长度为 1。

测试它(使用您问题的原始输入):

$ cat file
and 3
now 2
for 2
something 7
completely 8
different 6
$ awk '{print substr($1,$2,1)}' file
d
o
o
i
e
r

【讨论】:

  • 使用 awk 是解决这个问题的优雅方案,但我不应该使用它(这是一个家庭作业)
  • @user3470438 你可以用什么?您尝试的方法行不通。你有什么限制?
  • @terdon 我可以使用 sed 和 unix 命令,但不能使用 AWK、perl 等语言。
  • @user3470438 我想说 awk 和 sed 一样是合法的核心 UNIX 工具。
  • @TomFenech 我不反对,我只是不允许使用 AWK,只能使用 sed 和/或诸如 cut、xargs、... 之类的命令(即基本命令)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2021-11-14
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多