作为列变量的awk basename

作为列变量的awk basename,awk,filenames,Awk,Filenames,我想要完整的原始文件,最后一列是文件名(没有路径名)。这似乎很简单,但每次尝试都失败了。我的目标是将FLD0037变成FLD0${ID}的循环 我尝试了以下方法: cat FLD0037.txt | awk '{print $0, FILENAME;}' >FLD0037.test1.txt 测试1在最后一列中给出了 cat FLD0037.txt | awk '{print $0, basename(FILENAME);}' >FLD0037.test2.txt test.2是

我想要完整的原始文件,最后一列是文件名(没有路径名)。这似乎很简单,但每次尝试都失败了。我的目标是将FLD0037变成FLD0${ID}的循环

我尝试了以下方法:

cat FLD0037.txt | awk '{print $0, FILENAME;}' >FLD0037.test1.txt
测试1在最后一列中给出了

cat FLD0037.txt | awk '{print $0, basename(FILENAME);}' >FLD0037.test2.txt
test.2是一个空文件

cat FLD0037.txt | awk '{print $0, basename;}' >FLD0037.test3.txt
cat FLD0037.txt | awk -F"/" '{print $0, $NF;}' >FLD0037.test4.txt
cat FLD0037.txt | awk -F"/" '{print $NF;}' >FLD0037.test5.txt
cat FLD0037.txt | awk '{print basename $0;}' >FLD0037.test6.txt
test.3、test.5和test.6看起来像原始文件,在最后一列中没有写入任何内容

cat FLD0037.txt | awk '{print $0, basename(FILENAME);}' >FLD0037.test2.txt
test.4是原始文件,数据在新列中重复


谢谢,

由于Awk最终读取的是标准输入(因此是
-
伪文件名),而不是实际的文件,
cat
比这里更重要

和往常一样,解决方法很简单:不要使用无用的
cat

awk '{print $0, FILENAME;}' FLD0037.txt >FLD0037.test1.txt

工作正常,我要问的唯一改进是如何在指定整个文件路径时编写它,并且只使用文件名而不使用路径作为列变量。
{l=split(FILENAME,b,“/”;print$0,b[l]}
?或者作为优化
FNR==1{l=split(FILENAME,b,“/”;basename=b[l]}{print$0,basename}
切勿使用
l
(字母
el
)作为变量名,因为它看起来太像
1
(数字
1
),在某些字体中无法区分。实际上,我无法在您的评论中判断您是否正在通过名为
l
的变量或编号
1
b
进行索引,但看起来您可能使用了编号
1
这是错误的。当您运行
cat FLD0037.txt | awk'{print$0,basename(FILENAME);}“>FLD0037.test2.txt
并注意到
test.2是一个空文件
难道您没有注意到更重要和有用的错误消息
awk:cmd吗。第1行:(FILENAME=file FNR=1)致命:未定义函数“basename”
或类似函数?不要在shell循环中这样做,因为awk完全能够打开和关闭多个文件,而且它比shell循环更高效、更健壮、更可移植。你有GNU awk吗?如果有,是什么版本?如果没有-获取Gawk4.0或更高版本。