动态更改AWK字段分隔符

时间:2016-08-30 15:37:36

标签: linux bash awk

我想使用AWK获取以下电子表格,其中名字和姓氏在一列中:

Peter, Griffin, 31 Spooner St, Quahog
Homer, Simpson, 732 Evergreen Terr, Springfield
Fred, Flintstone, 301 Cobblestone Way, Bedrock

并输出到新的电子表格,其中名字和姓氏都有自己的列:

awk '{print $1 "," $2} {FS=","} {print $3} {FS=" "}' spreadsheet.csv

我已尝试动态更改字段分隔符,例如:

import smtplib
from socket import gaierror, timeout

class DataHandler:
    is_logged_in = None
    is_connected = None
    server_conn = None
    user_address = ''
    user_passwd = ''

    @staticmethod
    def try_connect():
        try:
            DataHandler.server_conn = smtplib.SMTP('smtp.gmail.com', 587, timeout=1) # The place where the connection is checked
            DataHandler.is_connected = True
        except (smtplib.SMTPException, gaierror, timeout):
            DataHandler.is_connected = False # Connection status changed upon a connection error

但它似乎没有这样的方式,我得到了一个混乱的混乱。这可能是使用AWK吗?

4 个答案:

答案 0 :(得分:2)

只要在第一个基于,的字段中找到空格,就添加一个逗号:

awk 'BEGIN {FS=OFS=","} {sub(/ /, ", ", $1)}1' file
#                             ^    ^^
#               find a space...    ... replace it with , plus space

使用您的文件:

$ awk 'BEGIN {FS=OFS=","} {sub(/ /, ", ", $1)}1' file
Peter, Griffin, 31 Spooner St, Quahog
Homer, Simpson, 732 Evergreen Terr, Springfield
Fred, Flintstone, 301 Cobblestone Way, Bedrock

这使用函数sub()在第一个字段中执行替换。

答案 1 :(得分:2)

用逗号空格替换第一个空格:

$ sed 's/ /, /' file.csv
Peter, Griffin, 31 Spooner St, Quahog
Homer, Simpson, 732 Evergreen Terr, Springfield
Fred, Flintstone, 301 Cobblestone Way, Bedrock

这里,s/ /, /是替代命令。它取代了找到的第一个,

要更改文件,请使用-i选项:

sed -i.bak 's/ /, /' file.csv

答案 2 :(得分:1)

您可以将多个分隔符用作 -

awk -F '[ ,]' '{print $1 ", " $2 ", " $3 $4 " " $5 " " $6 ", " $7 " " $8}' file

输出 -

Peter, Griffin,  31 Spooner St,  Quahog
Homer, Simpson,  732 Evergreen Terr,  Springfield
Fred, Flintstone,  301 Cobblestone Way,  Bedrock

你必须跟踪'列'虽然得到了定义。

答案 3 :(得分:1)

另一种可能性。

awk '{$1=$1","}1' file

Peter, Griffin, 31 Spooner St, Quahog
Homer, Simpson, 732 Evergreen Terr, Springfield
Fred, Flintstone, 301 Cobblestone Way, Bedrock
相关问题