我有一个像这样的文本文件:
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中测试)