Maison  >  Questions et réponses  >  le corps du texte

linux - shell 脚本给逗号分隔的内容添加双引号

有個文件 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
",%

不知道有没更好的方式实现此功能?

黄舟黄舟2764 Il y a quelques jours510

répondre à tous(6)je répondrai

  • 伊谢尔伦

    伊谢尔伦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表示替换所有匹配

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 15:02:51

    cat a | sed -e 's,\([0-9]\),\"\1\",g'

    répondre
    0
  • 巴扎黑

    巴扎黑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"

    répondre
    0
  • ringa_lee

    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'

    répondre
    0
  • 阿神

    阿神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

    répondre
    0
  • PHPz

    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所在位置

    répondre
    0
  • Annulerrépondre