列表处理,将列表转换为撇号和逗号分隔的记录,用括号括起来

时间:2017-04-10 10:49:19

标签: bash awk

我在名为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文件中添加(),请让我知道如何有效地完成所有操作,因为它应该是自动化的。

8 个答案:

答案 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(包围)。

npm registry(Linux和macOS)

安装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平台)

  • this 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')