如何在此命令的输出中包含文件名?

如何在此命令的输出中包含文件名?

如何在此命令的输出中包含文件名?

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

相关内容