连接 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
我有以下代码:
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