我有以下代码:
names=$(ls *$1*.txt)
head -q -n 1 $names | cut -d "_" -f 2
其中,第一行查找并存储与命令行输入相匹配的所有名称到一个名为name的变量中,第二行抓取每个文件中的第一行(变量名称的元素),并根据"_“标记输出行的第二部分。
这一切都很好,但是我想将文件名(作为变量名中的行存储)放在剪切输出的前面。我试过:
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>
其中,在文件名和裁剪结果之间只有一个空格。
谢谢。
发布于 2015-03-27 03:10:00
最佳方法,使用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
在这里,我们将文件的第一行读取到一个数组中,在_
上将其分割成几个部分。
发布于 2015-03-27 03:10:11
也许这样的东西可以满足您的需要,但这是糟糕的编码(请参阅注释):
#!/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
发布于 2015-03-27 03:24:22
如果我没有误解你的目标,这也有效。
我一直都是这样做的,我刚刚发现--这是一种不推荐的方法--。
#!/bin/bash
names=$(ls *"$1"*.txt)
for e in $names;
do echo $e `echo "$e" | cut -c2-2`;
done
https://stackoverflow.com/questions/29299046
复制相似问题