我正在使用带有 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 周围没有单引号,这是我需要的。
我想打印这个文件的第 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) 以 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) 我有两个具有不同列数和行数的表。我想使用公共列(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) 我想计算此演示文稿的文本文件中不同名称的数量:
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只访问第三列,但我无法让它打印行数。
有没有人会指导我从下面的单个字符串中只搜索包含模式 _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) 我在 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) 我只是想知道是否有人可以告诉我如何计算文本文件中每个不同字符的出现次数以及最后添加到一起的所有内容的总出现次数。
我只是想根据自己的知识来学习这个过程。
我有阿拉伯语塔什基尔语TXT的大文件,我正在尝试查找包含特定模式mashkula的 行,我尝试了以下语法:\xd9\x8e \xd9\x8b \xd9\x8f \xd9\x8c \xd9\x91 \xd9\x92 \xd9\x8dgrep
cat file.txt | grep "\xd8\xa7\xd9\x87\xd9\x84\xd8\xa7"\nRun Code Online (Sandbox Code Playgroud)\n在我插入塔什基尔标记之前,这不会返回任何内容:
\ncat file.txt | grep "\xd8\xa3\xd9\x87\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b"\nRun Code Online (Sandbox Code Playgroud)\n我得到了正确的输出
\n\xd8\xa3\xd9\x87\xd9\x92\xd9\x84\xd8\xa7\xd9\x8b
我也尝试过
\ngrep -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\nRun 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 ..\nRun 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",然后我就可以 …
我想以 格式对日期进行排序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日