Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 使用awk时如何防止新线路_Variables_Awk_Newline - Fatal编程技术网

Variables 使用awk时如何防止新线路

Variables 使用awk时如何防止新线路,variables,awk,newline,Variables,Awk,Newline,我已经看到了这个问题的几个变体,但没有一个答案对我的特定场景有帮助 我正在尝试加载一些文件,为filename添加一列。仅当我将文件名作为第一列时,此操作才有效。如果我把filename列放在末尾(我想要的地方),它会在$0和剩余打印之间创建一个新行,我无法停止 for f in "${FILE_LIST[@]}" do awk '{ print FILENAME,"\t",$0 } ' ${DEST_DIR_FILES}/$f > tmp ## this one works awk '{

我已经看到了这个问题的几个变体,但没有一个答案对我的特定场景有帮助

我正在尝试加载一些文件,为filename添加一列。仅当我将文件名作为第一列时,此操作才有效。如果我把filename列放在末尾(我想要的地方),它会在$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
--我想要这个(带文件名的新列):

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

奖金问题
我正在使用一个变量来传递文件名,但它正在放置整个路径。使用保存路径的变量只打印文件名(不带路径)或去掉文件路径的最佳方法是什么?

几乎可以肯定,当您的
awk
脚本语法正确时,会出现行尾问题。我怀疑
“${FILE\u LIST[@]}”
中的文件来自Windows框,并且有
\r\n
行结尾。要确认给定文件的行尾,可以在每个文件上运行
文件
命令,即
文件名

# 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
$ basename /tmp/foo
foo
要将文件转换为Unix样式的行尾,请运行以下命令:

$ for "f" in "${FILE_LIST[@]}"; do; dos2unix "$f"; done
说明:

文件名
是行中的第一个字符串时,回车
\r
实际上什么都不做,因为我们已经在行的开头了。当我们尝试在任何其他字符后打印
文件名
时,我们会看到下一行开头的效果,然后打印选项卡,然后打印
文件名

旁注:

Awk
具有变量
OFS
,用于设置输出字段分隔符,以便:

$ awk '{print $0,"\t",FILENAME}' file
可以重写为:

$ awk '{print $0,FILENAME}' OFS='\t' file
奖励答案

I.M.O剥离文件路径的最佳方法是使用实用工具
basename

# 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
$ basename /tmp/foo
foo
使用:


完美的它是CRLF,所以它在转换后工作。这是我第一次尝试awk,所以我自己永远也想不到。但是,如图所示的外部
basename
方法的问题是,只有在文件所在的目录中,它才起作用。我只需要执行
awk'{fname=FILENAME;sub(/.*\/,“”,fname);print fname}'/tmp/foo
$ awk '{print FILENAME}' $(basename /tmp/foo)
foo