我在名为Target_id_convert.txt的文件中有一个列表
<a target="_blank" href="https://www.google.co.uk/">
<i class="fa fa-facebook-official fa-3x" aria-hidden="true"></i>
</a>
期望的输出
70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
我写了这段代码
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
然后我必须手动编辑文件并在Target_id_convert_output.txt文件中添加(),请让我知道如何有效地完成所有操作,因为它应该是自动化的。
答案 0 :(得分:5)
这个awk单行应该做你想做的事:
awk -v q="'" '{$0=q $0 q;printf "%s%s", (NR==1?"(":","),$0}END{print ")"}' file
我声明var q
有单引号('
),以避免很多转义。
答案 1 :(得分:3)
假设您的记录是双线换行,我会使用sed
/ awk
组合:
<file sed "/[^[:blank:]]/ s/.*/'&'/g" |
awk '{ $1=$1; print "(" $0 ")" }' RS= FS='\n' OFS=,
如果输入为:
70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
输出是:
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
答案 2 :(得分:2)
$ cat f.awk
BEGIN {
sep = ""
b = "'"
}
{
ans = ans sep b $0 b
sep = ","
}
END { print "(" ans ")" }
用法:
awk -f f.awk file
答案 3 :(得分:2)
提供使用 trl
的替代,我的实用程序 tr 在单个和多个之间执行文本 l ine形式:
$ trl -S, -D\' -W'()' <<<$'70S ribosome\nALK tyrosine kinase receptor\nATP\nATP synthase'
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
-S,
将输出 s eparator设置为,
(项目之间放置的内容)-D\'
将输出项 d elimiter设置为'
(将每个项目括起来的内容)-W'()'
w 在(
和)
中对结果输出行进行raps(包围)。trl
注意:即使您不使用Node.js,它的包管理器npm
也可以跨平台工作,并且易于安装;尝试
curl -L https://git.io/n-install | bash
安装Node.js后,按如下方式安装:
[sudo] npm install trl -g
注意强>:
sudo
取决于您安装Node.js的方式以及您是否changed permissions later;如果您收到EACCES
错误,请使用sudo
再次尝试。-g
确保global installation,并且需要将trl
放入您的系统$PATH
。bash
的Unix平台)bash
script下载为trl
。chmod +x trl
使其可执行。$PATH
中的文件夹,例如/usr/local/bin
(OSX)或/usr/bin
(Linux)。答案 4 :(得分:1)
尝试:
awk -v s1="'" -v s2="'," -v s3="(" -v s4=")" 'NR==1{printf("%s",s3)} last{printf("%s",s1 last s2)} {last=$0} END{printf("%s\n",last s1 s4)}' Input_file
我用它们的值定义了s1,s2,s3和s4等变量。然后我打印(在第一行,然后将行的值取为名为last的变量,并使用值&#39;打印行值,在代码的END部分打印行&#39; s值为&#39 ;)也是。我正在考虑你的Input_file具有与示例Input_file相同的值。
答案 5 :(得分:1)
试试这个 -
$ cat f
70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
$ awk -v line=$(wc -l < f) -v ORS="" 'BEGIN{printf "("} {if(NR < line) {print a$0b}} END {print a$0a")\n"}' b="'," a="'" f
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
答案 6 :(得分:1)
在awk中:
void SortPal() {
int antal = pali.size();
string tempO;
bool byte = false;
for (int i = 0; i < antal - 1; i++) { //går igenom alla ord i vectorn
if (int(pali[i][0]) > int(pali[i + 1][0])) {
tempO = pali[i];
pali[i] = pali[i + 1];
pali[i + 1] = tempO;
i = -1;
}
else if (int(pali[i][0]) == int(pali[i + 1][0])) { //Om första bokstaven är samma kollar den följande
int minsta = pali[i].size();
if (minsta > pali[i + 1].size()) {
minsta = pali[i + 1].size();
}
for (int a = 1; a < minsta-1; a++){
if (int(pali[i][a]) > int(pali[i + 1][a])) { //byter om någon av bokstäverna efter den första är mindre än bokstäverna i andra ordet
tempO = pali[i];
pali[i] = pali[i + 1];
pali[i + 1] = tempO;
i = -1;
byte = true;
break;
}
}
if (byte == false && pali[i].size() > pali[i + 1].size()) { // byter om pali i+1 är mindre än pali i
tempO = pali[i];
pali[i] = pali[i + 1];
pali[i + 1] = tempO;
i = -1;
}
}
}
单个列表文件的输出:
$ awk 'BEGIN{q="\047";RS="";FS="\n";OFS=q","q}{$0="("q $0 "\)"q;$1=$1}1' file
说明:
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
*)来自GNU awk文档:通过特殊分配,空字符串作为RS的值表示记录由一个或多个空行分隔。当RS设置为空字符串时,每条记录总是在遇到的第一个空白行结束。下一条记录直到后面的第一条非空行才开始。这允许处理空行分隔列表。例如,使用@Tor的样本数据,输出将为:
awk '
BEGIN {
q="\047" # define q to - well, \047
RS="" # see below (*
FS="\n" # newline is input field separator
OFS=q","q # output field separator to ,
}
{
$0="(" q $0 "\)" q # surround record with single quotes
$1=$1 # rebuild the record
} 1' file # print
答案 7 :(得分:1)
只需设置字段和记录分隔符,重新编译记录并打印:
$ awk -v RS= -v s="('" -v ORS="')\n" -F'\n' -v OFS="','" '{$1=s$1}1' file
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')