使用 awk 重新格式化文本文件的列

hen*_*407 9 awk text-processing

好吧,既然这是一个复杂的问题,我就解释清楚。我得到了如下所示的文件内容:

$ Cat File1 
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
Run Code Online (Sandbox Code Playgroud)

我想要的输出

-Cool MNB +  POP ;
-Cool MNB  + POP ;
-Cool MNB  + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;
Run Code Online (Sandbox Code Playgroud)

首先,我尝试从 中取出最后一列File1并将其打印出来 sed 's/[{}//g' File1 > File3

之后我将整个内容复制File1到一个新的File4

cp File1 File4
Run Code Online (Sandbox Code Playgroud)

之后,我替换数据内的File4与所述File3数据(装置中的数据,而不托架一个“File1最后一列的一个”)

awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5 
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的

ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD
Run Code Online (Sandbox Code Playgroud)

最后,我尝试

awk -F“ " '{print - $2,$5 +,$4 ";"}‘ File5
Run Code Online (Sandbox Code Playgroud)

但是结果并没有像我想要的那样出来,只有类似的数据MNB都列出来了,其他的没有显示出来(文件最后一列数据),

Ban*_*uin 16

我不知道你为什么要左右复制东西。简单的事情是

awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1
Run Code Online (Sandbox Code Playgroud)

我把 放在-开头;,然后放在结尾。

在我们之间打印

  • $2 因为我们想要它本来的样子。
  • 的子串$5,即没有第一个和最后一个字符的字符串。我们从位置 2 开始跳过第一个字符(awk 一直对此很奇怪),并通过仅选择比原始字符短两个字符的子字符串来忽略最后一个字符$5
  • +,因为我们需要它
  • 进而 $4

但是,我不确定所有这些字符串函数是否都特定于 GNU awk。

  • 该命令是标准的,甚至可以与 70 年代的原始 `awk` 一起使用。 (3认同)

Cos*_*tas 7

sed

sed '
    s/\S\+\s/-/
    s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
    ' File1
Run Code Online (Sandbox Code Playgroud)

awk变体

awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1
Run Code Online (Sandbox Code Playgroud)


Kaz*_*Kaz 6

轻松的TXR工作:

$ txr -c '@(repeat)
@a @b @c @d {@e}
@(do (put-line `-@b @e + @d ;`))
@(end)' -
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
[Ctrl-D][Enter]
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD + POP ;
Run Code Online (Sandbox Code Playgroud)

使用TXR Lisp awk宏转写Awk解决方案:

 txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'
Run Code Online (Sandbox Code Playgroud)

字段在f列表中,索引从零开始。