我有这个文件
*PADS2000*
*PART*
C1 C2012
C10 C2012
*NET*
*SIGNAL* B2B_12V
F1.2 TC1.1
CNB2.88 U2.1
*SIGNAL* DDR3_VREF1
U9.M8 U9.H1
U5.6 C24.1
*END*
我希望将其转换为如下所示(列表信号名称和所有连接的part.pin名称在一行中)。
*SIGNAL* B2B_12V F1.2 TC1.1 CNB2.88 U2.1
*SIGNAL* DDR3_VREF1 U9.M8 U9.H1 U5.6 C24.1
我写的awk脚本是这样的。
BEGIN{print "========================="}
(d || f ) && (/*SIGNAL*/ || /*END/) {print "HAHAHA : " xline}
/*SIGNAL*/{kept=$0; f = 1; xline=$0; next}
f {print kept; f = 0; d = 1; print; xline=xline " " $0; next}
d {print; xline=xline " " $0}
输出是这样的。
=========================
*SIGNAL* B2B_12V
F1.2 TC1.1
CNB2.88 U2.1
CNB2.88 U2.1 AL* B2B_12V
*SIGNAL* DDR3_VREF1
U9.M8 U9.H1
U5.6 C24.1
U5.6 C24.1 NAL* DDR3_VREF1
*END*
有什么问题? (看起来每次连接它时都会覆盖字符串。)
编辑:我后来发现这在我想要的Cygwin中有效。我的CentOS shell似乎有些让它变得奇怪。如果我在Cygwin上运行它,它会像我预期的那样运行。 (我有空的时候会遇到我的shell问题。)$ awk -f why.awk in.dat
=========================
*SIGNAL* B2B_12V
U24.2 TC1.1
CNB2.88 U2.1
HAHAHA : *SIGNAL* B2B_12V U24.2 TC1.1 CNB2.88 U2.1
*SIGNAL* DDR3_VREF1
U9.M8 U24.H1
U5.6 C24.1
HAHAHA : *SIGNAL* DDR3_VREF1 U9.M8 U24.H1 U5.6 C24.1
*END*
答案 0 :(得分:1)
我在Cygwin上使用gawk对它进行了测试,但它也适用于我的CentOS 6.7 shell。但是我在上面的EDIT中添加了我的CentOS shell存在一些问题。 为了任何人的利益,我在这里附上我的gawk脚本:
cd /path/to/local/cloned/repo
git remote -v
输出:
BEGIN{print "========================="}
(f || d ) && (/*SIGNAL*/ || /*END*/) {
f=0; d = 0; n = asort(xline);
printf "%s ", kept;
for (i=1;i<=ix; i++){
printf "%s ", xline[i];
}
printf "\n";
ix = 0;
}
/*SIGNAL*/{
kept = $0; f = 1; next}
f {
f = 0; d = 1;
for(i=1;i<=NF;i++) {
xline[ix] = $i;
ix = ix + 1;
}
next}
d {
for(i=1;i<=NF;i++) {
xline[ix] = $i;
ix = ix + 1;
}
next}
编辑:
我后来发现这种奇怪的现象是因为输入文本文件来自DOS(Windos)。参见Adam Katz在awk string concatenation not working 2 (shell setting error?)中的回答。