如何获取每行的第一个单词并将其管道到dmenu脚本中



我有一个像这样的文本文件:

first state
second state
third state

从每行中获取第一个单词并不困难,但是当添加额外的n来分隔dmenu中的每个单词(选择)时,问题就来了,根据其语法:

echo -e "firstnsecondnthird" | dmenu

我还没能弄清楚如何添加分隔n。我试过了:

state=$(awk '{for(i=1;i<=NF;i+=2)print $(i)'n'}' text.txt) 

但是它不起作用。我还试了这个:

lol=$(grep -o "^S*" states.txt | perl -ne 'print "$_"')

但还是一样的。我不知道我做错了什么。

您的问题在AWK脚本中。您需要将每个输入行标识为一个记录。这样,您就可以控制如何通过ORS变量(输出记录分隔符)分隔输出中的每个记录。默认情况下,这个分隔符是换行符,这对于您的目的应该足够好了。

现在要打印每个输入记录(在本例中是输入流中的每一行)的第一个单词,您只需要打印第一个字段:
awk '{print $1}' textfile | dmenu

如果您需要输出包含显式的n字符串(而不是控制字符),那么您可以覆盖ORS变量以满足您的需求:

awk 'BEGIN{ORS="\n"}{print $1}' textfile | dmenu

这可以在while循环中更容易完成,请尝试以下操作。这很简单,当读取文件时,它创建了2个变量,第一个被命名为first,另一个是rest,首先包含我们稍后传递给dmenu的第一个字段。

while read first rest
do
dmenu "$first"
done < "Input_file"

根据文本文件的示例,下面应该可以实现您的要求:

awk '{ printf "%s\n",$1 }' textfile | dmenu

打印每行的第一个空格分隔字段以及n (n需要转义以防止awk解释)

在你的代码中

state=$(awk '{for(i=1;i<=NF;i+=2)print $(i)'n'}' text.txt)

您试图在awk代码中使用',但是代码是''之间的代码,因此代码是{for(i=1;i<=NF;i+=2)print $(i),这不起作用。对于awk代码中的字符串,应该使用"

如果您只想获得第n列,cut在大多数情况下就足够了,让states.txt内容为

first state
second state
third state

那么你可以这样做:

cut -d ' ' -f 1 states.txt | dmenu

解释:将空格作为分隔符(-d ' ')并得到第一列(-f 1)

(在cut (GNU coretils) 8.30中测试)

相关内容

  • 没有找到相关文章

最新更新