将单词列表合并为一行,然后添加字符

将单词列表合并为一行,然后添加字符

我想获取一个文件,该文件的每一行都有一个单词列表,例如。

act
bat
cat
dog
eel

并将它们放在一行中,用逗号分隔并引用它们。结果是这样的:

'act', 'bat', 'cat', 'dog', 'eel',

因此,一个单引号,然后是单词,然后是另一个单引号,然后是逗号,然后是空格。然后输出到具有新名称的新文件。

答案1

短的printf方法:

printf "'%s', " $(< file) > output

答案2

使用sedtr

$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n'
'act', 'bat', 'cat', 'dog', 'eel',

(输出末尾没有换行符)

在每行输入的开头和结尾插入sed引号(以及后面的逗号和空格),同时tr删除换行符。

将输出重定向到文件:

$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n' >newfile

答案3

使用awk

awk '{printf ("'\'%s\'', ", $0)}' infile > new_file
'act', 'bat', 'cat', 'dog', 'eel',

或者为了避免在末尾添加额外的逗号,请改用下面。

awk '{printf S"'\''"$0"'\''";S=", "}'
'act', 'bat', 'cat', 'dog', 'eel'

或者直接使用paste而不加引号。

paste -d, -s infile
act,bat,cat,dog,eel

然后通过帮助引用它sed

sed -r "s/(\w+)/'\1'/g" <(paste -d, -s infile)
'act','bat','cat','dog','eel'

答案4

Perl 方法:

$ perl -lne '$sq="\x27";push @a,$sq.$_.$sq;END{ print join( ",",@a) }' input.txt                                                                                                                                                           
'act','bat','cat','dog','eel'
  • 这里我们使用十六进制值作为存储在sq变量中的单引号,并且对于从文件读取的每一行,我们将其包装到单引号中
  • 每行带单引号的行都被推入a数组
  • 读取所有内容后, join 从每个数组项中创建一个文本字符串,通过以下方式连接,

Python 方法也遵循同样的思路:

$ python -c 'import sys;sq="\x27";print ",".join([ sq + l.strip() + sq  for l in sys.stdin  ])' < input.txt                                                                                                                                 
'act','bat','cat','dog','eel'
  • stdin这里我们通过 shell<操作符将输入文件重定向到命令的流中
  • 每行都通过 strip 方法从换行符中删除\n,通过 Perl 方法中描述的相同想法引用
  • 所有行都通过结构处理成列表[item for item in iterable](称为列表理解)
  • 最后",".join()让我们从所有列表项中创建一个漂亮的字符串

相关内容