连接echo和命令输出的结果

时间:2015-03-27 10:55:35

标签: linux bash printing printf echo

我有以下代码:

names=$(ls *$1*.txt) 
head -q -n 1 $names | cut -d "_" -f 2

其中第一行找到并将与命令行输入匹配的所有名称存储到名为names的变量中,第二行查找每个文件中的第一行(变量名称的元素)并输出基于该行的第二部分“_”delim。

这一切都很好,但我想将文件名(存储为变量名中的行)添加到cut的输出中。我试过了:

names=$(ls *$1*.txt) 
head -q -n 1 $names | echo -n "$names" cut -d "_" -f 2

但是这只打印出文件名

我试过了

names=$(ls *$1*.txt 
head -q -n 1 $names | echo -n "$names"; cut -d "_" -f 2

我再次打印出文件名。

所需的输出是:

$
filename1.txt <second character>

文件名和剪切结果之间只有一个空格。

谢谢。

3 个答案:

答案 0 :(得分:3)

最佳方法,使用awk

你可以在awk的一次调用中完成所有这些:

awk -F_ 'NR==1{print FILENAME, $2; exit}' *"$1"*.txt

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


Pure bash solution

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

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

for i in *"$1"*.txt; do
    IFS=_ read -ra arr <"$i"
    echo "$i ${arr[1]}"
    break
done

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

我总是这样做,我发现这是一种不赞成使用的方式

#!/bin/bash

names=$(ls *"$1"*.txt)
for e in $names;
    do echo $e `echo "$e" | cut -c2-2`;
done