Linux 仅提取文件名的Shell脚本

Linux 仅提取文件名的Shell脚本,linux,shell,basename,Linux,Shell,Basename,我有这样的文件格式(publishfile.txt) 我只想提取名称OMEGA****,样本,样本(1)How 我可以这样做吗?我在代码中使用了basename,但它在for循环中不起作用。这是我的示例代码 for line in $(cat $BASE_PATH/publishfile.txt) do FILE_PATH=$(echo "line"| awk '{print $NF}' ) done FILE_NAME=($basename $FILEPATH) 但在for

我有这样的文件格式(publishfile.txt)

我只想提取名称OMEGA****,样本,样本(1)How 我可以这样做吗?我在代码中使用了basename,但它在for循环中不起作用。这是我的示例代码

for line in $(cat $BASE_PATH/publishfile.txt)
do 
      FILE_PATH=$(echo "line"| awk '{print  $NF}' )
done
FILE_NAME=($basename  $FILEPATH)
但在for loop外部使用时,此代码也不起作用

请尝试以下操作:

cat$BASE\u PATH/publishfile.txt | awk'{print$7}'| sed's/*\/'
输出将是:

OMEGA
sample
sample(1)
更新:如果您的所有文件、文件夹至少包含一个斜杠(
/
),我想
cat x.txt | sed的/*\//'
仍然可以工作


对于使用的命令,手册是:,

在上面的代码中,您有一个输入错误。你的代码是:

    FILE_NAME=($basename  $FILEPATH)
但它应该是

    FILE_NAME=$(basename  $FILEPATH)
这应该在循环内外都能正常工作

awk-F/'{print$NF}'$BASE_PATH”/publishfile.txt
这只是说分隔符是斜杠,我们需要每行的最后一个字段


在读取循环时,基本上不应该在shell
中的每个输入行上运行Awk(更不用说;默认情况下,Awk本身可以做到这一点,比shell更快更好。

在for循环行中?是的,您可以重定向输出,这是真的,它也可能更高效。这可能取决于文件的大小。我试过file_NAME=$(basename$FILEPATH)但是它不起作用。你能在你试过但不起作用的地方发布实际的代码吗?正确地说,你也应该引用
“$FILEPATH”
但当然,如果您将故障
保留在循环中,则实际修复任何引用问题将为时已晚。如果文件包含类似以下内容,则此操作无效:
drwxrwx---+h655201超组0 2019-04-24 09:16示例
(即,没有斜杠的文件路径
/
字符)。您的所有其他评论都是正确的!
awk
本身执行循环,等等。使用
awk
sed
确实是一个更好的解决方案!不是直接的,尽管它不会很难适应(请尝试-F
[/\t]
)如何使用以逗号分隔文件名的方式?与示例一样,示例1请参见中的节参数展开。如果这不符合您的情况,请在此处提出一个新问题,在这里您可以精确指定输入的格式,以及您希望实现的目标。如果您询问如何提供排序输出,Awk脚本可以您可以更改为使用
printf
而不是
print
。如果您询问输入,我完全同意前面的评论。
    FILE_NAME=$(basename  $FILEPATH)