如果我有一个字符串“1 2 3 2 1” - 或一个数组 [1,2,3,2,1] - 我如何选择唯一值,即
"1 2 3 2 1" produces "1 2 3"
Run Code Online (Sandbox Code Playgroud)
或者
[1,2,3,2,1] produces [1,2,3]
Run Code Online (Sandbox Code Playgroud)
类似于 uniq 但 uniq 似乎适用于整行,而不是一行内的模式......
我有一个输入文件FILE1.TXT如下。
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Run Code Online (Sandbox Code Playgroud)
我想搜索属于特定Id 的所有字段并获取NAME的值
我设法遍历每个Id并根据需要为每个Id形成以下命令。
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
这里的问题是,我得到了输出NAME1,除此之外,我还得到了NAMEXYZ。
应该改变什么,以便我只得到NAME1而不是NAMEXYZ?
作为解决方法,以下命令有效。 …
这是一道作业题:
匹配所有以小写字母开头但不以大写字母结尾的 2 个或更多字符的文件名。
我不明白为什么我的解决方案不起作用。
所以我执行了以下操作:
touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax
ls [a-z]*[!A-Z]
Run Code Online (Sandbox Code Playgroud)
输出:
aa ha
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么它不匹配“ah”、“hh”或“a123e”?
以下是否有正则表达式匹配字符集中的字符但只匹配一次?换句话说,一旦找到一个字符,就把它从集合中删除。
如果 grep 不能做到这一点,是否有内置的实用程序可以做到这一点?
例子:
Characters to match only once: spine
Run Code Online (Sandbox Code Playgroud)
输入:
spine
spines
spin
pine
seep
spins
Run Code Online (Sandbox Code Playgroud)
输出:
spine
spin
pine
Run Code Online (Sandbox Code Playgroud)
编辑:
有很多方法可以实现这个输出(下面的一个例子),但我正在寻找一种方法来做到这一点,而不必为我想要匹配的每个模式自定义命令。
grep '[spine]' input_file | grep -v 's.*s' | ... | grep -v 'e.*e'
我知道这[]在ls模式匹配中起作用:
$ ls
foo.c foo.h
$ ls foo.[ch]
foo.c foo.h
Run Code Online (Sandbox Code Playgroud)
但我找不到记录在哪里。
我想知道与这些匹配的语法:
$ ls
foo.asd foo.qwe
Run Code Online (Sandbox Code Playgroud)
这是我最好的猜测:ls foo.[{asd}{qwe}]。这没用。
假设我有一个包含很多单词的文件,我只想找到模式为“xyz”的第一个单词。如果同一行中有多个具有此模式的单词,我该怎么办?
-m返回匹配的第一行中的所有单词。我只需要 grep 命令。
说,我有一个文件,必须在其中搜索多个正则表达式,并且必须计算每个正则表达式的匹配数。
因此,我无法组合这些模式:
grep -Po '{regex_1}|{regex_2}|...|{regex_n}' file | wc -l
Run Code Online (Sandbox Code Playgroud)
... 因为需要每个正则表达式的出现次数。
我显然可以:
occurences[i]=$(grep -Po "${regex[i]}" file | wc -l)
Run Code Online (Sandbox Code Playgroud)
...但不幸的是,遇到的文件可能非常大(> 1 GB)并且有许多模式(在数千个范围内)需要检查,这使得该过程非常缓慢,因为对同一文件进行多次读取涉及。
有没有办法快速做到这一点?
我正在寻找一个选项来删除具有特定文本的列,例如
“滴滴”
aaa bbb ccc ddd eee fff
1 2 3 4 5 6
2 3 4 5 6 0
Run Code Online (Sandbox Code Playgroud)
所以输出看起来像这样:
aaa bbb ccc eee fff
1 2 3 5 6
2 3 4 6 0
Run Code Online (Sandbox Code Playgroud)
我知道有一个简单的选项可以删除第 4 列并且可以完成相同的工作,但是我的 *.csv 文件没有排序。有任何想法吗?
我有一个带有二维码行的文件,我只想grep为那些子序列长度不增加的文件。例子:
这个很好,因为下一个序列与前一个序列更少或相同:
####### ###### ### ### ## # # #
Run Code Online (Sandbox Code Playgroud)
这个是错的:
### ## ## ### ### ### ###### ##
Run Code Online (Sandbox Code Playgroud)
我是这样开始的:
egrep "[^#](####)+[ ]+(##)+" qr.txt
Run Code Online (Sandbox Code Playgroud)
但后来我意识到不可能继续了..
我想为匹配模式的每个文件执行一个命令。但是似乎正确的命令对我不起作用,我不知道为什么。
$ find . -type f -name '*.c' -or -name '*.h' -or -name '*.cpp' -exec ls {} \;
$ ls
script.sh test.c test.h
Run Code Online (Sandbox Code Playgroud)