标签: text-processing

如何在 awk 语句中转义撇号?

我正在使用带有 bash shell 的 Ubuntu Linux。如何在 awk 语句中转义撇号?我想在使用 awk 从文件中提取数据后输出一些 SQL,所以我有:

awk -F',' '{print "SELECT * from user where id = '"$2"';"}' myfile.csv
Run Code Online (Sandbox Code Playgroud)

但这仅打印出:

SELECT * from user where id = ;
Run Code Online (Sandbox Code Playgroud)

如果我将上面修改为

awk -F',' '{print "SELECT * from user where id = "$2";"}' myfile.csv
Run Code Online (Sandbox Code Playgroud)

然后我得到这样的声明

SELECT * from user where id = cf915247dfcf47b6814b5350e5cbdfd8;
Run Code Online (Sandbox Code Playgroud)

但 id 周围没有单引号,这是我需要的。

command-line bash awk text-processing

6
推荐指数
1
解决办法
5375
查看次数

打印第一列

我想打印这个文件的第 1 列。我使用了这个命令:awk '{print $1}'但它只打印了第一列的第一个单词。

数据

ABC transporters                             ABC transporters
Alanine, aspartate and glutamate metabolism  Alanine, aspartate 
alpha-Linolenic acid metabolism              alpha-Linolenic acid metabolism
Aminoacyl-tRNA biosynthesis                  Aminoacyl-tRNA biosynthesis
Amino sugar and nucleotide sugar metabolism  Amino sugar and nucleotide
Arachidonic acid metabolism                  Arachidonic 
Run Code Online (Sandbox Code Playgroud)

输出:

ABC
Alanine,
alpha-Linolenic
Aminoacyl-tRNA
Amino
Arachidonic
Run Code Online (Sandbox Code Playgroud)

期望输出:

ABC transporters
Alanine, aspartate and glutamate metabolism
alpha-Linolenic acid metabolism 
Aminoacyl-tRNA biosynthesis 
Amino sugar and nucleotide sugar metabolism 
Arachidonic acid metabolism 
Run Code Online (Sandbox Code Playgroud)

command-line text-processing

6
推荐指数
2
解决办法
3198
查看次数

使用 sed 编辑匹配模式的任何一个出现

以 Fred Flintstone开头的行应附加一些字符串。?查找指定出现的 Fred Flintstone 并将其附加。

对于出现这种模式的任何人,我如何使用此命令?我试过

sed '/Fred Flintstone/ s/$/ someString/2' filename
Run Code Online (Sandbox Code Playgroud)

显然上面的一个不起作用。它适用于所有事件,但不适用于特定事件。(假设我想替换第一个或第二个或第三个 [其中任何一个])

示例文件 1:

Fred Flintstone 
Johnson Stone
Fred Flintstone
Fred Flintstone
Michael Clark
Run Code Online (Sandbox Code Playgroud)

所需的输出文件 1:

Fred Flintstone 
Johnson Stone
Fred Flintstone someString
Fred Flintstone
Michael Clark
Run Code Online (Sandbox Code Playgroud)

command-line sed text-processing

6
推荐指数
3
解决办法
2455
查看次数

如何提取具有共同列的记录?

我有两个具有不同列数和行数的表。我想使用公共列(B 列是公共的)查找行。这是一个例子。能否请你帮忙?

file1.txt

A  B    C   D
a  b    c   d
i  ii  iii iV
*  **   #  ##
Run Code Online (Sandbox Code Playgroud)

file2.txt

E  B  
f  ff 
h  b
g  gg
k  ii
Run Code Online (Sandbox Code Playgroud)

输出:

A  B    C   D  E
a  b    c   d  h
i  ii  iii iV  k
Run Code Online (Sandbox Code Playgroud)

command-line text-processing

6
推荐指数
2
解决办法
464
查看次数

计算文件中不同名称的数量

我想计算此演示文稿的文本文件中不同名称的数量:

2008 girl Avah
2009 girl Avah
2008 girl Carleigh
2011 girl Kenley
2012 boy Joseph
2013 boy Joseph
2014 boy Isaac
2014 boy Brandon
Run Code Online (Sandbox Code Playgroud)

所以基本上我想跳过重复并作为答案 6。我试图awk只访问第三列,但我无法让它打印行数。

grep awk text-processing wc

6
推荐指数
2
解决办法
695
查看次数

如何从匹配模式的单个字符串中提取单词?

有没有人会指导我从下面的单个字符串中只搜索包含模式 _ARA 的单词。

细绳:

LINK:['IM219MIR_ARA1','IM18Q4_ARA1','SM18Q4_ARA1','IM18PLANNING_ARA1','IM118Q4DYNVA_ARA1','IM218Q4DYNVA_ARA1','IM119EIOPALTG_ARA1','IM219EIOPALTG_ARA1','SM119EIOPALTG_ARA1']}
Run Code Online (Sandbox Code Playgroud)

预期输出:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
Run Code Online (Sandbox Code Playgroud)

grep text-processing

6
推荐指数
1
解决办法
1915
查看次数

如何使用 grep 检查文件中是否有换行符的特定字符串?

我在 bash 脚本文件中有一个字符串变量,如下所示:

string="

test1

test2

"
Run Code Online (Sandbox Code Playgroud)

我想检查一个文件是否test.txt包含这个特定的字符串(包括换行符。即,如果它只包含以下内容,它应该失败:

this is a test:
test1

test2
and another one
Run Code Online (Sandbox Code Playgroud)

因为 test1 上方和 test2 下方的换行符不存在。

(我之所以要检查这个是因为我想检查某段代码是否在源文件中,如果没有,则添加它。)


以下不起作用:

string="
    
    test1
    
    test2
    
    "
if ! grep -q string "test.txt"; then
    echo "$string" >> test.txt
fi
Run Code Online (Sandbox Code Playgroud)

这可以正确地将字符串添加到文件中,但即使已经添加了该字符串,它也会执行此操作。此外,当我将字符串更改为没有换行符时,它会正确执行。


编辑:

下面@terdon 和@steeldriver 的答案适用于我上面写的字符串示例,但由于某种原因,它们不适用于这个更实际的示例:

string="                                                                
                                                               
if [ -f ~/.script ]; then                            
        . ~/.script         
fi

"  
Run Code Online (Sandbox Code Playgroud)

command-line bash grep text-processing

6
推荐指数
1
解决办法
2718
查看次数

如何计算文本文件中每种类型的字符(并总计)?

我只是想知道是否有人可以告诉我如何计算文本文件中每个不同字符的出现次数以及最后添加到一起的所有内容的总出现次数。

我只是想根据自己的知识来学习这个过程。

command-line text-processing

6
推荐指数
2
解决办法
527
查看次数

如何 grep 查找带有变音符号的阿拉伯字符?

我有阿拉伯语塔什基尔语TXT的大文件,我正在尝试查找包含特定模式mashkula的 行,我尝试了以下语法:\xd9\x8e \xd9\x8b \xd9\x8f \xd9\x8c \xd9\x91 \xd9\x92 \xd9\x8dgrep

\n
cat file.txt | grep "\xd8\xa7\xd9\x87\xd9\x84\xd8\xa7"\n
Run Code Online (Sandbox Code Playgroud)\n

在我插入塔什基尔标记之前,这不会返回任何内容:

\n
cat file.txt | grep "\xd8\xa3\xd9\x87\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b"\n
Run Code Online (Sandbox Code Playgroud)\n

我得到了正确的输出

\n

\xd8\xa3\xd9\x87\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b

\n

我也尝试过

\n
grep -P "[\xd9\x8f\\ \xd9\x91\\ \xd9\x8e\\ \xd9\x8b\\ \xd9\x90\\ \xd9\x8d\\ \xd9\x8c\\ \xd9\x92\\ \\~]|[\xd8\xa7\xd9\x87\xd9\x84\xd8\xa7]" file.txt\n
Run Code Online (Sandbox Code Playgroud)\n

这将返回不同模式中的所有匹配字符:

\n
\xd8\xa3\xd9\x87\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b \xd8\xa3 ... \xd9\x87\xd9\x92.. \xd9\x84\xd9\x8b\xd8\xa7 \xd8\xa3\xd9\x86\xd9\x92\xd8\xaa\xd9\x8e \xd9\x84\xd9\x8e\xd9\x8a\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b ..\n
Run Code Online (Sandbox Code Playgroud)\n

如何使用 grep 匹配阿拉伯语变音标记?\n在使用 grep 之前是否可以从文本中删除塔什基尔标记?\n我的操作系统是 Ubuntu 18.04

\n

更新:此时,我使用以下命令从文本中删除塔什基尔标记:\n sed "s/[\xd9\x8f \xd9\x91 \xd9\x8e \xd9\x8b \xd9\x90 \xd9\x8d \xd9\x8c \xd9\x92]//g",然后我就可以 …

command-line grep arabic text-processing

6
推荐指数
1
解决办法
1039
查看次数

如何使用“sort”命令按年月日升序排序?

我想以 格式对日期进行排序31.12.2023。应首先显示最低年份,然后显示最低月份,最后显示最低日期。

下面的代码符合我的需求吗?乍一看似乎不错。

sort -t '.' -k 3.1 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

但对我来说更有意义的是:

sort -t '.' -k 3.4 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

但这并没有按照我想要的方式排序。

编辑:

谢谢您的回复!

@Dan 谢谢你非常详细的解释。仍然不知道如何准确地处理关键选项。我测试了你的代码,但它仍然混合了一些东西。也许这是我在变量中使用它的方式,或者可能是字符串中内容的类型。

然后尝试了@FedKad 的提示,这似乎像我的 -k 3.1 -k 2.1 -k 1.1 一样工作。和-k 3 -k 2 -k 1 意思一样吗?

目前我只有 2023 年的条目,所以无法评估年份是否也有效,但现在使用上面的键,我已经按照我想要的方式进行了排序。也许我描述我需要的结果是失败的,但现在我得到了日最低到最高和月最低到最高。今年我将不得不等到 2024 年到来:)这是我的输出示例

2023年1月7日

2023年1月8日

2023年1月9日

2023年1月21日

2023年1月26日

2023年1月27日

2023年2月2日

command-line sort text-processing

6
推荐指数
1
解决办法
758
查看次数

标签 统计

text-processing ×10

command-line ×8

grep ×4

awk ×2

bash ×2

arabic ×1

sed ×1

sort ×1

wc ×1