我试图找到一种衬纸,以便在相关符号之前打印每行,并在相关符号之后仅保留1个字符:
输入:
thisis#atest
thisisjust#anothertest
just#testing
所需的输出:
thisis#a
thisjust#a
just#t
awk -F"#" '{print $1 "#" }'
几乎可以给我我想要的东西,但我还需要找到一种方法来打印第二个字符。有什么想法吗?
答案 0 :(得分:1)
您可以用sed代替#
后第一个字符之后的内容:
sed 's/\(#.\).*/\1/'
答案 1 :(得分:0)
您可以使用grep:
$ grep -o '[^#]*#.' infile
thisis#a
thisisjust#a
just#t
这匹配#
以外的字符序列,后跟#
和任何字符。 -o
选项仅保留匹配项本身。
答案 2 :(得分:0)
使用GNU awk中的特殊RT
变量,您可以执行以下操作:
awk 'BEGIN{RS="#.|\n"}RT!="\n"{print $0 RT}'
答案 3 :(得分:0)
第一种解决方案: 。能否请您尝试以下操作。
awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH)}' Input_file
以上将按照您的要求打印其中包含#
的行,并保留不包含这些行的行,以防您要完全打印这些行,然后在后面使用。
awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH);next} 1' Input_file
第二个解决方案:
awk 'BEGIN{FS=OFS="#"} {print $1,substr($2,1,1)}' Input_file
答案 4 :(得分:0)
获取“#”的索引,然后拉出子字符串。
$ awk '{print substr($0,1,index($0,"#")+1);}' in.txt
thisis#a
thisisjust#a
just#t
答案 5 :(得分:0)
Ravindes第二个示例的一些小变化
awk -F# '{print $1"#"substr($2,1,1)}' file
awk -F# '{print $1FS substr($2,1,1)}' file
另一种grep
版本(到目前为止发布最短的版本):
grep -oP '.+?#.' file
o
仅打印匹配项P
Perl正则表达式(由于+?
).
任何字符+
及更多?
,但终止于:#
.
再加上一个字符如果我们不添加?
。这行test#one#two
变成test#one#t
,而不是test#o
对贪婪的+
答案 6 :(得分:0)
如果要使用awk,最简单的方法是使用index
来查找字符的位置:
awk 'n=index($0,'#') { print substr($0,1,n+1) }' file
但是,有较短且专用的工具。查看其他答案。