我有以下代码:
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>
文件名和剪切结果之间只有一个空格。
谢谢。
答案 0 :(得分:3)
你可以在awk的一次调用中完成所有这些:
awk -F_ 'NR==1{print FILENAME, $2; exit}' *"$1"*.txt
在第一个文件的第一行,打印文件名和第二列的值,然后退出。
我总是建议不要解析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