连接 echo 的结果和命令输出

concatenate the result of echo and a command output

我有以下代码:

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

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

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

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

但是这只会打印出文件名

我试过了

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

我又一次只打印了文件名。

期望的输出是:

$
filename1.txt <second character>

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

谢谢。

最佳方法,使用 awk

您可以一次调用 awk 来完成所有这些:

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

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


纯bash溶液

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

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

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

这里我们把文件的第一行读入一个数组,在_.

上把它分成几块

也许类似的东西可以满足您的需要但这是错误的编码(见评论):

#!/bin/bash

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

如果我没有误解你的目标,这也行得通。

我一直都是这样做的,我只是发现 这是一种不推荐使用的方法

#!/bin/bash

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