如何获取每一行的第一个单词并将其通过管道传输到 dmenu 脚本中
How to get first word of every line and pipe it into dmenu script
我有一个这样的文本文件:
first state
second state
third state
从每一行中获取第一个单词并不困难,但问题是在 dmenu 中添加分隔每个单词(选择)所需的额外 \n 时,根据其语法:
echo -e "first\nsecond\nthird" | 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 '{ printf "%s\n", }' textfile | dmenu
打印每行的第一个 space 分隔字段以及 \n(\n 需要转义以阻止它被 awk 解释)
您的问题出在 AWK 脚本中。您需要将每个输入行标识为一条记录。这样,您可以控制输出中的每条记录如何通过 ORS 变量(输出记录分隔符)进行分隔。默认情况下,此分隔符是换行符,应该足以满足您的需要。
现在要打印每个输入记录的第一个单词(在这种情况下是输入流中的每一行),您只需要打印第一个字段:
awk '{print }' textfile | dmenu
如果您需要输出包含明确的 \n
字符串(而不是控制字符),那么您只需覆盖 ORS 变量即可满足您的需要:
awk 'BEGIN{ORS="\n"}{print }' textfile | dmenu
这可以在 while
循环中更容易地完成,请您尝试以下操作。这很简单,在读取文件时,它创建了 2 个变量,第一个被命名为 first
,另一个是 rest
,首先包含我们稍后传递给 dmenu 的第一个字段。
while read first rest
do
dmenu "$first"
done < "Input_file"
在你的代码中
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
解释:将 space 视为分隔符 (-d ' '
) 并获得第一列 (-f 1
)
(在 cut (GNU coreutils) 8.30 中测试)
我有一个这样的文本文件:
first state
second state
third state
从每一行中获取第一个单词并不困难,但问题是在 dmenu 中添加分隔每个单词(选择)所需的额外 \n 时,根据其语法:
echo -e "first\nsecond\nthird" | 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 '{ printf "%s\n", }' textfile | dmenu
打印每行的第一个 space 分隔字段以及 \n(\n 需要转义以阻止它被 awk 解释)
您的问题出在 AWK 脚本中。您需要将每个输入行标识为一条记录。这样,您可以控制输出中的每条记录如何通过 ORS 变量(输出记录分隔符)进行分隔。默认情况下,此分隔符是换行符,应该足以满足您的需要。
现在要打印每个输入记录的第一个单词(在这种情况下是输入流中的每一行),您只需要打印第一个字段:
awk '{print }' textfile | dmenu
如果您需要输出包含明确的 \n
字符串(而不是控制字符),那么您只需覆盖 ORS 变量即可满足您的需要:
awk 'BEGIN{ORS="\n"}{print }' textfile | dmenu
这可以在 while
循环中更容易地完成,请您尝试以下操作。这很简单,在读取文件时,它创建了 2 个变量,第一个被命名为 first
,另一个是 rest
,首先包含我们稍后传递给 dmenu 的第一个字段。
while read first rest
do
dmenu "$first"
done < "Input_file"
在你的代码中
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
解释:将 space 视为分隔符 (-d ' '
) 并获得第一列 (-f 1
)
(在 cut (GNU coreutils) 8.30 中测试)