Linux 格式化文本Awk Sed

Linux 格式化文本Awk Sed,linux,bash,awk,sed,Linux,Bash,Awk,Sed,嗨,我有一个文件,我需要把一个格式,我可以拉到excel电子表格我不知道如何做到这一点,如果你能帮助我,我将不胜感激 这是输入示例 #1 Indiana University—​Bloomington (Kelley) Bloomington, IN 90 58 82 86 #1 Temple University (Fox) Philadelphia, PA 95 66 97 95 #1 University of North Carolina—​Chapel H

嗨,我有一个文件,我需要把一个格式,我可以拉到excel电子表格我不知道如何做到这一点,如果你能帮助我,我将不胜感激

这是输入示例

#1

Indiana University—​Bloomington (Kelley) 
Bloomington, IN

90  58  82  86 
#1

Temple University (Fox) 
Philadelphia, PA

95  66  97  95 
#1

University of North Carolina—​Chapel Hill (Kenan-​Flagler) 
Chapel Hill, NC

73  58  100     75 
#4
这是输出

#1, Indiana University—​Bloomington (Kelley) Bloomington, IN,   90, 58, 82, 86,
#1, Temple University (Fox) Philadelphia, PA,           95,     66,     97,     95, 
我在linux中使用shell脚本


谢谢

虽然您完全可以通过一点
awk
脚本来实现这一点,但我建议您不要这样做

实际上,
awk
对于任何不太复杂的东西都很方便,但是在这里,由于您已经计划使用Excel,您最好导入普通文件,然后在Excel中处理它,旋转、重塑、拆分它

然而,我讨厌Excels的复杂性,因此我的python2方法(将其保存为
program.py
,并将其作为
chmod 755 program.py
执行):

并将此作为

program.py input.txt > output.csv
编辑:输入错误,以及:

我经常这么说,但是在一个shell脚本中做一些事情,而不是以调用大量命令为中心,通常比使用任何通用脚本语言的效果要差得多。Python在任何地方都非常丰富,我很少发现自己在编写bash脚本


EDIT2:好的,主机上没有python。吓人的;P.使用
bash
内置的
read
功能(
manread
)。

虽然你完全可以通过

awk
脚本来实现,但我建议你不要这样做

实际上,
awk
对于任何不太复杂的东西都很方便,但是在这里,由于您已经计划使用Excel,您最好导入普通文件,然后在Excel中处理它,旋转、重塑、拆分它

然而,我讨厌Excels的复杂性,因此我的python2方法(将其保存为
program.py
,并将其作为
chmod 755 program.py
执行):

并将此作为

program.py input.txt > output.csv
编辑:输入错误,以及:

我经常这么说,但是在一个shell脚本中做一些事情,而不是以调用大量命令为中心,通常比使用任何通用脚本语言的效果要差得多。Python在任何地方都非常丰富,我很少发现自己在编写bash脚本


EDIT2:好的,主机上没有python。吓人的;P.使用
bash
内置的
read
功能(
manread
)。

如果不尝试以基于行的方式使用GNU awk和mawk,这对GNU awk和mawk来说相当简单。我们将在行首使用

#
作为记录分隔符,并使用换行符作为字段分隔符。然后:

awk -v RS='(^|\n)#' -F'\n' 'NR > 1 { gsub(/ +/, ", ", $6); print "#" $1 ", " $3 " " $4 ", " $6 }' filename
即:

NR > 1 {                              # the first record is the empty bit before
                                      # the first separator, so we skip it
  gsub(/ +/, ", ", $6)                # then: insert commas in the number row
  print "#" $1 ", " $3 " " $4 ", " $6 # and reassemble the record in the right
                                      # format for printing.
}

使用正则表达式作为记录分隔符并不是严格符合POSIX的,但是在gawk和mawk之间,您将覆盖大多数基础

如果您不尝试以基于行的方式使用GNU awk和mawk,这对GNU awk和mawk来说相当简单。我们将在行首使用
#
作为记录分隔符,并使用换行符作为字段分隔符。然后:

awk -v RS='(^|\n)#' -F'\n' 'NR > 1 { gsub(/ +/, ", ", $6); print "#" $1 ", " $3 " " $4 ", " $6 }' filename
即:

NR > 1 {                              # the first record is the empty bit before
                                      # the first separator, so we skip it
  gsub(/ +/, ", ", $6)                # then: insert commas in the number row
  print "#" $1 ", " $3 " " $4 ", " $6 # and reassemble the record in the right
                                      # format for printing.
}

使用正则表达式作为记录分隔符并不是严格符合POSIX的,但是在gawk和mawk之间,您将覆盖大多数基础

解决此问题的Awk脚本:

/^#[0-9]/ {current = $0}

/\([A-Za-z ]+\)/ { current = current "," $0}

/[A-Z]+$/ { current = current $0}

/^[0-9]+/ {current = current "," $1 "," $2 "," $3 "," $4; print current}
用法:

cat yourdatafile | awk -f script.awk > output.csv
说明:

每个正则表达式匹配不同行上的模式,并在正则表达式旁边执行该行的操作

  • 对于#编号,使用#编号初始化/覆盖当前变量
  • 对于没有状态的文本信息,请在开始处用逗号将其添加到当前变量中
  • 对于具有状态的文本信息,请将其添加到当前变量中,且开头不带逗号
  • 对于数字列表,请将它们添加到当前变量,并在开始处和之间使用逗号,然后打印当前变量

    • 解决问题的Awk脚本:

      /^#[0-9]/ {current = $0}
      
      /\([A-Za-z ]+\)/ { current = current "," $0}
      
      /[A-Z]+$/ { current = current $0}
      
      /^[0-9]+/ {current = current "," $1 "," $2 "," $3 "," $4; print current}
      
      用法:

      cat yourdatafile | awk -f script.awk > output.csv
      
      说明:

      每个正则表达式匹配不同行上的模式,并在正则表达式旁边执行该行的操作

      • 对于#编号,使用#编号初始化/覆盖当前变量
      • 对于没有状态的文本信息,请在开始处用逗号将其添加到当前变量中
      • 对于具有状态的文本信息,请将其添加到当前变量中,且开头不带逗号
      • 对于数字列表,请将它们添加到当前变量,并在开始处和之间使用逗号,然后打印当前变量
      • 拆下并拆下入口线处的预成型件
      • 保留其余信息
      • 最后,加载缓冲区
      • 删除第一个换行符
      • 和后面的字符本身替换任何未后跟
        #
        的新行
      • 打印结果
      如果最后一个
      是强制性的(通常不在csv/excel文件中),则将
      /[0-9]/s/*/,/g
      与此
      相适应/[0-9]/{s/*/,/g;s/$/,/;}

      • 拆下并拆下入口线处的预成型件
      • 保留其余信息
      • 最后,加载缓冲区
      • 删除第一个换行符
      • 和后面的字符本身替换任何未后跟
        #
        的新行
      • 打印结果

      如果最后一个
      是强制性的(通常不在csv/excel文件中),则将
      /[0-9]/s/*/,/g
      与此
      相适应/[0-9]/{s/*/,/g;s/$/,/;}

      这里有一种使用awk的替代方法,只需操作输出字段分隔符(
      OFS
      )和输出记录分隔符(
      ORS
      ):

      输出:

      印第安纳大学-​布卢明顿(凯利),布卢明顿,伊利诺伊州,90,58,82,86 #宾夕法尼亚州费城坦普尔大学福克斯分校1号,95,66,97,95 北卡罗来那大学,1​教堂山(基南)-​弗拉格勒),北卡罗来纳州教堂山,73,58,100,75 #4,
      这里有一种使用awk的替代方法,只需操作输出字段分隔符(
      OFS
      )和输出记录分隔符(
      ORS
      ):

      输出: