Maison > Questions et réponses > le corps du texte
有個文件 a
,其內容為:
1, 2, 3
$ head a
1, 2, 3
想把上面的文件转成如下的格式 用于 sql 条件查询中:
"1","2","3"
利用 awk
試了以下三種方式:
#多出了一个空行
$ awk -v 'RS= ' {print} a
1,
2,
3
#想通过这种方式删除空行 失败
$ awk -v 'RS= ' '{gsub(/^$/,"");print}' a
1,
2,
3
#3后面有个换行
$ awk -v 'RS= ' 'ORS=","{gsub(/,$/,"");print "\""$0"\""}' a
"1","2","3
",%
不知道有没更好的方式实现此功能?
伊谢尔伦2017-04-17 15:02:51
ruby -e 'print $_.gsub(/\d/){|i| %("#{i}")} while gets' a
解释:
1, ruby -e
执行后面字串命令
2, $_
表示gets
的内容
3, gsub
用于字串匹配替换
4, %(...)
, 用于生成字串, 否则要""#{i}"", 比较难看
5, gets
, 会读入标准输入, 或文件
或更简单的使用sed:
sed 's,\([0-9]\),"\1",g' a
解释:
1, sed
默认对文件的每一行执行动作
2, s
表示进行文本替换
3, ,
为分隔符, 可以是;
, /
, !
等
4, \(...\)
表示正则表达式的'组', 以方便后面的\1
进行反向引用
5, [0-9]
匹配数字
6, g
表示替换所有匹配
巴扎黑2017-04-17 15:02:51
如果你不介意,可以使用 Python 來寫 script:
步驟1: 利用 Python 寫 script,取名 change
(也可以是別的名字):
#!/usr/bin/python3
import sys
with open(sys.argv[1]) as reader:
for line in reader:
items = line.strip().split(',')
print(', '.join(('"{0}"'.format(item.strip()) for item in items)))
步驟2: 記得在 script: change
最上方加入 shebang line (#! 再加上有效的 Python 路徑)
#!/usr/bin/python3
步驟3: 將 script change
的權限改為可執行,比如說:
$ chmod change a+x
步驟4: 將 change
放到 PATH
中的任何路徑下,比如說:
$ sudo mv change /usr/local/bin
之後就可以用它來轉換拉:
$ change a
"1", "2", "3"
ringa_lee2017-04-17 15:02:51
同可以sed
cat a | sed -e 's,\(\s\)\+,\1,g' -e 's,\(\S\+\),"\1",g'
当然也有其它方式
cat a | perl6 -e 'dd .split(/\s+/) for $*IN.lines'
阿神2017-04-17 15:02:51
看题主使用AWK的方式,以下是我测试可行的方案
代码:
awk 'gsub(/,/," "){for(i=1;i<=NF;i++){if(i<NF){printf "\""$i"\","} else{printf "\""$i"\""}}{printf "\n"}}' file.txt
PHPz2017-04-17 15:02:51
我来一个node版的:
#!/usr/local/bin/node
var fs = require('fs')
var args = process.argv.slice(2)
var text = ""
args.forEach(file => {
try {
text = text + "\n" + String(fs.readFileSync(file)).trim()
} catch (e) {
console.log(e.toString())
}
})
if (text) {
console.log(text.trim().split(/\n|,/).map(char => `\"${char}\"`).join(","))
}
可以这样使用:
$ chmod 755 change.js
$ node ./change.js a b
a文件的内容为1,2,3
b文件的内容为4,5,6
结果输出:"1","2","3","4","5","6"
注意:我用的是Mac,linux中跟Mac路径不一致,请使用which node
查找node
所在位置