我有以下代码:
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>
文件名和剪切结果之间有一个空格。
谢谢。
最佳答案
最佳方法,使用 awk
您可以一次调用 awk 来完成所有这些:
awk -F_ 'NR==1{print FILENAME, $2; exit}' *"$1"*.txt
在第一个文件的第一行,打印文件名和第二列的值,然后退出。
纯 bash 解决方案
我总是建议不要解析 ls
- 相反我会使用循环:
您可以通过使用 bash 内置功能避免使用 awk
读取文件的第一行:
for i in *"$1"*.txt; do
IFS=_ read -ra arr <"$i"
echo "$i ${arr[1]}"
break
done
这里我们将文件的第一行读取到一个数组中,在 _
上将其拆分成多个部分。
关于linux - 连接 echo 的结果和命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29299046/