假设我有一个文件 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。我想对整个文件执行此操作,然后将形成一个词:)
最佳答案
纯 shell 解决方案:
$ while read word num; do echo ${word:$((num-1)):1}; done < a.txt
d
o
o
i
e
r
这是使用经典的 while;做 ... ; 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 开始计数),长度是一。结果是数字给定位置的单个字母。
关于bash - 使用 xargs 作为 cut 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049865/