格式化文本awk Sed

时间:2015-02-17 19:57:33

标签: 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 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脚本

由于

5 个答案:

答案 0 :(得分:3)

如果你不尝试以基于行的方式使用它,那么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之间,您将拥有大多数基础。

答案 1 :(得分:1)

用于解决问题的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

说明:

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

  • 对于#number,使用#number初始化/覆盖当前变量。
  • 对于没有状态的文本信息,请将其添加到当前变量中,并在开头使用逗号
  • 对于带有State的文本信息,请将其添加到当前变量中,而不要在开头使用逗号
  • 对于数字列表,将它们添加到当前变量中,在开头用逗号分隔,然后在每个变量之间打印当前变量

答案 2 :(得分:0)

尽管你可以通过一些awk脚本来完成这项工作,但我建议你不要这样做。

实际上,awk对于任何不太复杂的东西都很方便,但是在这里,因为你已经计划使用Excel,你可能只需导入普通文件,然后在excel中处理它,转动,重塑,分裂它。

然而,我讨厌 Excel复杂性,所以这是我的python2方法(将其保存为program.py并使其可执行为chmod 755 program.py):

#!/usr/bin/python
import sys

wholefile = open(sys.argv[1], "r").read()
parts = wholefile.split("#")

for item in parts:
    lines = item.split("\n")
    output = [ int(lines[0]), lines[2], lines[3],lines[5].split() ]
    print ";".join(output)

并将其作为

运行
program.py input.txt > output.csv

编辑:拼写错误,并且:

我倾向于经常这样说,但是在shell脚本中做一些事情并不是非常希望调用很多命令,这通常远没有使用任何通用脚本语言那么有效。 Python到处都是如此丰富,我很少发现自己在编写bash脚本。

EDIT2:好的,所以主机上没有python。可怕的; P使用bash的内置read功能(man read)。

答案 3 :(得分:0)

 sed '#n;/[0-9 ]/ s/  */, /g;/^ *$/d;H;$!b;g;s/.//;s/\n\([^#]\)/, \1/g;p' YourFile
  • 删除并预先格式化输入行
  • 保留剩余信息
  • 最后,加载缓冲区
  • 删除第一个换行符
  • 替换#之后没有,的所有新行和后面的字符
  • 打印结果

如果最后一个,是强制性的(通常不在csv / excel文件中),请使用此/[0-9 ]/ s/ */, /g

调整;/[0-9 ]/ {s/ */, /g; s/$/,/;}

答案 4 :(得分:0)

以下是通过仅操作输出字段分隔符(OFS)和输出记录分隔符(ORS)来使用awk执行此操作的另一种方法:

grep -v '^$' infile |      # remove empty lines
awk 'NR%4 { ORS=", "; OFS=" " } NR%4 == 0 { ORS="\n"; OFS=", " } $1=$1'

输出:

#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,