Awk 以逗号分隔的单行形式打印文件内容

Awk 以逗号分隔的单行形式打印文件内容,awk,sed,Awk,Sed,如何以引号和逗号分隔的单行打印文件内容 $cat test file1.gz file2.gz file3.gz file4.gz 我想打印为'file1.gz'、'file2.gz'、'file3.gz'、'file4.gz'使用分隔符将一列转换为一行。使用sed和粘贴: sed "s/.*/'&'/" file | paste -sd "," 输出: 'file1.gz','file2.gz','file3.gz','file4.gz' 'file1.gz'、'file2.gz'

如何以引号和逗号分隔的单行打印文件内容

$cat test
file1.gz
file2.gz
file3.gz
file4.gz

我想打印为
'file1.gz'、'file2.gz'、'file3.gz'、'file4.gz'

使用分隔符将一列转换为一行。使用sed和粘贴:

sed "s/.*/'&'/" file | paste -sd ","
输出:

'file1.gz','file2.gz','file3.gz','file4.gz' 'file1.gz'、'file2.gz'、'file3.gz'、'file4.gz'
使用分隔符将一列转换为一行。使用sed和粘贴:

sed "s/.*/'&'/" file | paste -sd ","
输出:

'file1.gz','file2.gz','file3.gz','file4.gz' 'file1.gz'、'file2.gz'、'file3.gz'、'file4.gz' 或等效功能,但将整个输入文件存储在内存中:

$ awk '{out=out sep "\047" $0 "\047"; sep=","} END{print out}' file
'file1.gz','file2.gz','file3.gz','file4.gz'
并缩写为高尔夫球手:-):

就我个人而言,我会使用上面的第一个脚本,除非您在打印之前需要构建整个输出记录,例如根据多行regexp以某种方式对其进行修改

或等效功能,但将整个输入文件存储在内存中:

$ awk '{out=out sep "\047" $0 "\047"; sep=","} END{print out}' file
'file1.gz','file2.gz','file3.gz','file4.gz'
并缩写为高尔夫球手:-):


就个人而言,我会使用上面的第一个脚本,除非您在打印它之前有一些特定的需要来构建整个输出记录,例如,根据多行regexp以某种方式修改它。

注意,并不总是
\047
,但是以可移植的方式编写它并不是那么糟糕:
awk“{printf\%s'%s',sep',0;sep=“,”}结束{print”“}输入
@williampersell何时是
'
而不是
\047
?不要将脚本用双引号括起来,因为这样会将其其余部分暴露给shell进行解释,其中包含逃逸/引用/破坏地狱(例如,脚本中的$0将是shell$0,而不是awk,并且在最后打印时,我很确定会打印空字符串或最后读取的记录,具体取决于您的awk版本)。如果要使用文字引号,它应该是
awk'{printf”%s'\''%s'\''''''''',sep,$0;sep=“,”}END{print'}文件
谢谢Ed,我喜欢awk'{printf”%s\047%s\047',sep,$0;sep=“,“}END{print”“}或awk-v q=“”''{printf s%s',sep,q$0;sep=“,“}END{print”“,在EBCDIC中,单引号是0x7D。事实上,这类事情确实会导致引用地狱,但在这种情况下并没有那么糟糕,如果仔细观察,您会发现我的示例中的
$0
被传递到
awk
,而不是通过shell扩展。双引号将尽快终止(紧跟在需要打印的最后一个单引号之后)。您是最后一个示例(使用变量
q
作为单引号)是避免这种丑陋的好方法!我不喜欢将
q
设置为单引号的地方是,不能在保存在文件中的awk脚本中执行此操作,以作为
awk-f脚本运行,因此如果要将脚本保存在文件中,并且不能在所有上下文中使用它,例如在regexp文本中,尽管
\047
无处不在(EBCDIC系统除外!)请注意
'
并不总是
\047
,但它的可移植性并不差:
awk“{printf\%s'%s'”,sep,$0;sep=“,”}END{print”“}input
@williampersell when是
'
不是
\047
?不要将脚本用双引号括起来,因为这样会将其其余部分暴露给shell进行解释,其中包含逃逸/引用/破坏地狱(例如,脚本中的$0将是shell$0,而不是awk,并且在最后打印时,我很确定会打印空字符串或最后读取的记录,具体取决于您的awk版本)。如果要使用文字引号,它应该是
awk'{printf”%s'\''%s'\''''''''',sep,$0;sep=“,”}END{print'}文件
谢谢Ed,我喜欢awk'{printf”%s\047%s\047',sep,$0;sep=“,“}END{print”“}或awk-v q=“”''{printf s%s',sep,q$0;sep=“,“}END{print”“,在EBCDIC中,单引号是0x7D。事实上,这类事情确实会导致引用地狱,但在这种情况下并没有那么糟糕,如果仔细观察,您会发现我的示例中的
$0
被传递到
awk
,而不是通过shell扩展。双引号将尽快终止(紧跟在需要打印的最后一个单引号之后)。您是最后一个示例(使用变量
q
作为单引号)是避免这种丑陋的好方法!我不喜欢将
q
设置为单引号的地方是,不能在保存在文件中的awk脚本中执行此操作,以作为
awk-f脚本运行,因此如果要将脚本保存在文件中,并且不能在所有上下文中使用它,例如在regexp文本中,尽管
\047
在任何地方都能工作(EBCDIC系统除外!),我只是删除了“linux”标签。请阅读您申请的标签说明!我刚刚删除了“linux”标签。请阅读您申请的标签说明!