linux - 如何从 awk 选择值的文件中打印文件名?

标签 linux shell unix

我有一个 .txt 文件,文件名为

z1.cap
z2.cap
z3.cap
z4.cap

这些文件中的示例数据如下所示,

OTR 25896 PAT210 $TREMD DEST

OFR 21475 NAT102 #TREMD DEST

然后我使用下面的代码从文件中打印所需的值。

while read file_name
do
echo "progressing with file :${file_name}"
cat ${file_name} | grep "PAT210" | awk -F' ' '$5 == "(DEST" { print $file_name, $1}' | uniq >> OUTPUT_FILE

现在我想要包含 2 个字段的输出,例如,

z1.cap OTR
z2.cap OFR

等等……

但是我得到的输出是这样的

- OTR
- OFR

感谢任何帮助,谢谢。

最佳答案

要访问 awk 当前正在处理的文件名,请使用内置变量 FILENAME

要将 shell 中的其他 shell 变量绑定(bind)到 awk 中的变量,请使用:

awk -v var1=$shvar1 -v var2=$shvar2 'your awk code using var1 and var2'

假设files.txt包含您的文件列表,并且对您要实现的目标的理解为零:

for file_name in $(cat files.txt)
do
    echo "progressing with file :${file_name}"
    awk -F' ' '($5 == "DEST") && ($3=="PAT210") { print FILENAME, $1}' $file_name | uniq >> OUTPUT_FILE
done

我删除了 cat 并将 grep 合并到您的 awk 中。猫是不必要的,因为 awk 可以读取文件本身。

你可以完全删除 for 循环

awk -F' ' '($5 == "DEST") && ($3=="PAT210") { print FILENAME, $1}' $(<files.txt) | uniq >> OUTPUT_FILE

$(<files.txt)会将每个文件名发送到 awk。

关于linux - 如何从 awk 选择值的文件中打印文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53411222/

相关文章:

python - 以某些标准特别开始的阅读行

linux - 如何使用egrep查找以数字开头的字符串

bash - 使用 NppExec(和 Cygwin)在 Notepad++ 中的 Windows 上运行 bash shell 脚本

c - 在 gcc 中使用 -D 标志定义多字宏

C - 在 Windows 上编写在 UNIX 上编译,反之亦然

algorithm - 通过标志组值平滑地分割成固定序列

linux - 在 Linux 中将以 'a' 'c' 或 'e' 开头的前 N ​​个文件从一个文件夹复制到另一个文件夹

c# - Process.Start 崩溃无一异常(exception)

linux - 在Redhat服务器上,是否可以在线增加/var,如何增加?

shell - 有管道时,sudo如何处理权限