Linux 格式化文本Awk Sed
嗨,我有一个文件,我需要把一个格式,我可以拉到excel电子表格我不知道如何做到这一点,如果你能帮助我,我将不胜感激 这是输入示例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
#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
):
输出: