首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用awk时如何防止新行的出现

使用awk时如何防止新行的出现
EN

Stack Overflow用户
提问于 2014-02-20 23:39:39
回答 1查看 1.5K关注 0票数 1

我看到了这个问题的几个变体,但没有一个答案对我的特殊情况有所帮助。

我正在尝试加载一些文件,为文件名添加一列。只有当我将文件名作为第一列时,这才能正常工作。如果我把文件名列放在末尾(在我想要的地方),它会在$0和无法停止的打印的其余部分之间创建一个新行。

代码语言:javascript
复制
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 

示例数据:

-我要从这个开始:

代码语言:javascript
复制
A       B       C
aaaa    bbbb    cccc
1111    2222    3333

-我要这一栏(新列有文件名):

代码语言:javascript
复制
A       B       C       FILENAME
aaaa    bbbb    cccc    FILENAME
1111    2222    3333    FILENAME            

-我得到了这个(\t和新行的文件名):

代码语言:javascript
复制
A       B       C
        FILENAME
aaaa    bbbb    cccc
        FILENAME
1111    2222    3333
        FILENAME

奖励问题我使用一个变量来传递文件名,但是它把整个路径都放进去了。使用保存路径的变量只打印文件名(没有路径)~或删除文件路径的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 23:46:59

这几乎肯定是一个行尾问题,因为您的awk脚本在语法上是正确的。我怀疑您在"${FILE_LIST[@]}"中的文件来自一个Windows,并且有\r\n行的结尾。要确认给定文件的行尾,可以在每个文件上运行file命令,即file filename

代码语言:javascript
复制
# 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运行以下命令:

代码语言:javascript
复制
$ for "f" in "${FILE_LIST[@]}"; do; dos2unix "$f"; done

解释:

FILENAME是行中的第一个字符串时,回车返回\r实际上什么也不做,因为我们已经在行的开头了。当我们尝试在任何其他字符之后打印FILENAME时,我们会看到将我们带到下一行开头的效果,然后打印FILENAME

附带说明:

Awk具有用于设置输出字段分隔符的变量OFS,因此:

代码语言:javascript
复制
$ awk '{print $0,"\t",FILENAME}' file

可重写为:

代码语言:javascript
复制
$ awk '{print $0,FILENAME}' OFS='\t' file

奖金答案

去除文件路径的最佳方法是使用实用程序basename

代码语言:javascript
复制
$ basename /tmp/foo
foo

使用命令替换

代码语言:javascript
复制
$ awk '{print FILENAME}' $(basename /tmp/foo)
foo
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21922145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档