我已经看到了这个问题的几种变体,但是没有一个答案对我的特定情况有所帮助。
我正在尝试加载一些文件,为文件名添加一列。仅当我将文件名放在第一列时,此方法才能正常工作。如果我将文件名列放在末尾(我想要的位置),它将在$ 0和我无法停止的其余打印内容之间创建新行。
for f in "${FILE_LIST[@]}"
do
awk '{ print FILENAME,"\t",$0 } ' ${DEST_DIR_FILES}/$f > tmp ## this one works
awk '{ print $0,"\t",FILENAME } ' ${DEST_DIR_FILES}/$f > tmp ## this one does not work
mv tmp ${DEST_DIR_FILES}/$f
done > output
示例数据:
-我从这个开始:
A B C
aaaa bbbb cccc
1111 2222 3333
-我想要这个(带有文件名的新列):
A B C FILENAME
aaaa bbbb cccc FILENAME
1111 2222 3333 FILENAME
-我得到这个(\ t和文件名在新行上):
A B C
FILENAME
aaaa bbbb cccc
FILENAME
1111 2222 3333
FILENAME
额外的问题是,我使用变量来传递文件名,但这是整个路径。最好仅打印文件名(不带路径)的最佳方法是使用保存路径的变量或将路径删除掉。
几乎可以肯定的是,由于awk
脚本在语法上是正确的,因此行结尾问题。我怀疑您的文件"${FILE_LIST[@]}"
来自Windows框,并且具有\r\n
行尾。要确认给定文件的行尾,您可以file
在每个文件上运行命令,即 file filename
:
# create a test file
$ echo test > foo
# use unix2dos to convert to Windows style line endings
$ unix2dos foo
unix2dos: converting file foo to DOS format ...
# Use file to confirm line endings
$ file foo
foo: ASCII text, with CRLF line terminators
# Convert back to Unix style line endings
$ dos2unix foo
dos2unix: converting file foo to Unix format ...
$ file foo
foo: ASCII text
要将文件转换为Unix样式的行尾,请\n
运行以下命令:
$ for "f" in "${FILE_LIST[@]}"; do; dos2unix "$f"; done
说明:
当FILENAME
是行的第一个字符串时,回车\r
实际上不会执行任何操作,因为我们已经在行的开头。当我们尝试FILENAME
在其他任何字符之后打印时,我们看到带到下一行开头的效果,先打印TAB,然后打印FILENAME
。
边注:
Awk
具有OFS
用于设置输出字段分隔符的变量,因此:
$ awk '{print $0,"\t",FILENAME}' file
可以改写为:
$ awk '{print $0,FILENAME}' OFS='\t' file
奖励答案
IMO剥离文件路径的最佳方法是使用该实用程序basename
:
$ basename /tmp/foo
foo
使用命令替换:
$ awk '{print FILENAME}' $(basename /tmp/foo)
foo
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句