我已经尝试了各种解决方案,以找到一个很好的方法来通过一个以特定单词开头的文件,并以特定单词结尾。
假设我有一个名为states.txt
的文件包含:
Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming
我想 catstates.txt
并获得以下以Idaho
开头并以South Dakota
结尾的状态。
我也想忽略这样一个事实,即状态是按字母顺序排列的(我要去的实际文件内容不是这样的顺序)。
结果应如下所示:
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
感谢您在此方面的时间和耐心。我感谢您提供的任何帮助。
awk '/Idaho/{f=1} f; /South Dakota/{f=0}' file
请参阅Explain awk command了解更多 awk 范围习语。
不要养成使用/start/,/end/
的习惯,因为它使琐碎的事情变得非常简短,但即使是最轻微的需求变化(例如不打印边界线)也需要完全重写或重复的条件。
例如,给定此输入文件:
$ cat file
a
b
c
d
e
打印 b 和 d 之间的线,然后排除任一或两个边界线:
$ awk '/b/{f=1} f; /d/{f=0}' file
b
c
d
$ awk 'f; /b/{f=1} /d/{f=0}' file
c
d
$ awk '/b/{f=1} /d/{f=0} f;' file
b
c
$ awk '/d/{f=0} f; /b/{f=1}' file
c
如果您的起点是awk '/b/,/d/' file
,请尝试并注意所需的其他语言结构和重复条件:
$ awk '/b/,/d/' file
b
c
d
$ awk '/b/,/d/{if (!/b/) print}' file
c
d
$ awk '/b/,/d/{if (!/d/) print}' file
b
c
$ awk '/b/,/d/{if (!(/b/||/d/)) print}' file
c
此外,这并不明显,但一个阴险的错误爬到上面。请注意,在这个新的输入文件中,现在在“c”和“d”之间的附加“b”:
$ cat file
a
b
c
b
d
e
并再次尝试从输出中排除第一条边界线:
$ awk 'f; /b/{f=1} /d/{f=0}' file
c
b
d
-> SUCCESS
$ awk '/b/,/d/{if (!/b/) print}' file
c
d
-> FAIL
你实际上需要写这样的东西来保持使用范围并排除第一个边界线
$ awk '/b/,/d/{if (c++) print; if (/d/) c=0}' file
c
b
d
但到那时,它显然变得有点傻,你会重写它只是使用像我原来的建议的标志。
将 sed 与模式范围一起使用:
sed '/^Idaho$/,/^South Dakota$/!d' filename
或 AWK 具有相同的模式范围:
awk '/^Idaho$/,/^South Dakota$/' filename
在这两种情况下,^
和$
分别匹配行的开头和结尾,因此^Virginia$
仅在整行为Virginia
时匹配(即West Virginia
不匹配)。
或者,如果你喜欢固定字符串匹配超过正则表达式匹配(它在这里没有区别,但可能在其他情况下):
awk '$0 == "Idaho", $0 == "South Dakota"' filename
#all bash
__IFS=$IFS
IFS=' '
list=$(cat file.txt)
start="Idaho"
stop="South Dakota"
fst=${list#*$start}
snd=${fst%$stop*}
result="$start$snd$stop"
echo $result
IFS=$__IFS
Seehttp://tldp.org/LDP/abs/html/string-manipulation.html
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(35条)