使用xargs作为切割的参数

时间:2014-09-25 23:40:50

标签: bash unix cut cat xargs

假设我有一个文件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。我想为整个文件执行此操作,然后将形成一个单词:)

2 个答案:

答案 0 :(得分:2)

纯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),长度是1。结果是数字给出的位置上的单个字母。

答案 1 :(得分:1)

我建议您使用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