如何在此命令的输出中包含文件名?
tail -n 1 *.txt |awk -F "|" '{print $2}'
答案1
这需要 GNU Awk:
awk -F "|" 'ENDFILE{print $2, FILENAME}' *.txt
PS 您确实应该添加所需输出的示例,而不仅仅是在注释中描述它。
答案2
请注意,在任何情况下标准tail
仅支持最多一个文件名作为参数。
有些确实接受多个文件名参数,但输出因实现而异,并且通常不可能可靠地进行后处理。
在这里,使用类似 Korn/POSIX shell,您可以执行以下操作:
for file in *.txt; do
tail -n1 < "$file" | {
IFS='|' read -r ignore value ignore && printf '%s\n' "$file: $value"
}
done
答案3
使用perl:
#!/usr/bin/perl
use strict;
use autodie qw(open);
foreach my $f (@ARGV) {
# Simple implementation of `tail -1`:
# Seek to somewhere near the end of the file and
# begin reading lines until we're at eof. Then
# extract and print the 2nd field along with the
# filename.
my $size = -s $f;
my $seek = int($size / 20); # start with 1/20th of file size
$seek = 500 if $seek < 500; # min 500 bytes
$seek = 5000 if $seek > 5000; # max 5000
open(my $fh,'<',$f);
seek($fh, -$seek, 2);
while (<$fh>) {
if (eof) {
chomp;
my @fields = split /\|/;
printf "%s: %s\n", $f, $fields[1];
}
};
close($fh);
};
另存为,例如./tail1-col2.pl
,使可执行文件chmod +x ./tail1-col2.pl
并运行为:
./tail1-col2.pl *.txt