您好我有一个文件,我需要放入一个格式,我可以拉到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脚本
由于
答案 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
说明:
每个正则表达式匹配不同行上的模式,并在正则表达式旁边执行该行的操作。
答案 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,