首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >连接回波结果和命令输出。

连接回波结果和命令输出。
EN

Stack Overflow用户
提问于 2015-03-27 10:55:34
回答 3查看 934关注 0票数 1

我有以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
names=$(ls *$1*.txt) 
head -q -n 1 $names | cut -d "_" -f 2

其中,第一行查找并存储与命令行输入相匹配的所有名称到一个名为name的变量中,第二行抓取每个文件中的第一行(变量名称的元素),并根据"_“标记输出行的第二部分。

这一切都很好,但是我想将文件名(作为变量名中的行存储)放在剪切输出的前面。我试过:

代码语言:javascript
代码运行次数:0
运行
复制
names=$(ls *$1*.txt) 
head -q -n 1 $names | echo -n "$names" cut -d "_" -f 2

但是,这只会打印出文件名。

我试过了

代码语言:javascript
代码运行次数:0
运行
复制
names=$(ls *$1*.txt 
head -q -n 1 $names | echo -n "$names"; cut -d "_" -f 2

再说一遍,我只打印文件名。

期望的输出是:

代码语言:javascript
代码运行次数:0
运行
复制
$
filename1.txt <second character>

其中,在文件名和裁剪结果之间只有一个空格。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-27 11:10:00

最佳方法,使用awk

您可以在对awk的一次调用中做到这一点:

代码语言:javascript
代码运行次数:0
运行
复制
awk -F_ 'NR==1{print FILENAME, $2; exit}' *"$1"*.txt

在第一个文件的第一行上,打印文件名和第二列的值,然后退出。

纯bash溶液

我总是建议不要解析ls --而是使用循环:

通过使用bash内置功能,可以避免使用awk读取文件的第一行:

代码语言:javascript
代码运行次数:0
运行
复制
for i in *"$1"*.txt; do
    IFS=_ read -ra arr <"$i"
    echo "$i ${arr[1]}"
    break
done

在这里,我们将文件的第一行读取到一个数组中,在_上将其分割成几个部分。

票数 3
EN

Stack Overflow用户

发布于 2015-03-27 11:10:11

也许这样的东西可以满足您的需要,但这是糟糕的编码(请参阅注释):

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash

names=$(ls *$1*.txt)    
for f in $names
do
  pattern=`head -q -n 1 $f | cut -d "_" -f 2`
  echo "$f $pattern"
done
票数 0
EN

Stack Overflow用户

发布于 2015-03-27 11:24:22

如果我没有误解你的目标,这也有效。

我一直都是这样做的,我刚刚发现--这是一种不推荐的方法--

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash

names=$(ls *"$1"*.txt)
for e in $names;
    do echo $e `echo "$e" | cut -c2-2`;
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29299046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档