2017-09-16 75 views
1

AWK到打印线2,并把该第三和第四backslashs线1和2之间AWK打印LINE2到某一个地方

线1是

http://example.com// 
test 

输出所需

http://example.com/test/ 

测试可以是任何文字 所以通过倾斜字做

我已经尝试与此AWK线,但在其放入到行的末尾1 不是我想要的

awk 'NR%2{printf "%s ",$0;next;}1' file1 > file2 

回答

1

这是一个(lulz,大部分)与GAWK和mawk的作品,但失败,例如原始的awk :

$ awk '{printf (sub(/\/$/,"")?$0:"") (getline?$0:"") "/" ORS; exit}' file 

另外,如果NR==2记录有一个&失败,滥用非常功能,但:

$ awk '{p=$0;sub(/.$/,(getline?$0 "&":""),p);print p;exit}' file 
+1

如果原来的awk你的意思是破旧的awk,那么你永远不必说,如果一个脚本失败,因为大多数脚本将因为它是破烂不堪。相反,如果你的意思是用nawk或者POSIX awk,那么值得注意,但是我没有看到任何会导致awk失效的东西(当然,除了通常的getline警告外)。 –

0

给这个AWK的一行一试:

kent$ cat f 
http://example.com// 
test 

kent$ awk -v RS="\0" '{sub("/$",$2"/",$1)}$0=$1' f 
http://example.com/test/ 
+0

整洁。如果第二行例如是'test&',它会失败(我正在玩类似的想法)。 ...并用这个输入你可以删除''/“'部分。 :D –

+0

恕我直言,你应该只使用非恒定的条件进行打印,当你想要有条件地进行打印时。通过使用'{...} $ 0 = $ 1'而不是'{...; $ 0 = $ 1} 1',您必须考虑是否存在$ 0可能评估awk认为是零的情况,所以会导致当前记录不合要求地不被打印。它还让下一代人阅读你的代码,想知道你为什么写这个代码,因为他们会认为你故意在某种情况下试图产生输出,所以它会混淆你的代码。投资额外的2个角色是值得的! –

1

如何:

$ awk -F/ -v OFS=/ 'NR == 1 { line = $0; next } 
    { s = $0; $0 = line; $(NF - 1) = s; print }' file 

保存的第一行,并跳到下一行。保存第二行,将$0重置为第一行,将第二行的内容插入倒数第二列并打印。

1
$ awk 'NR==1{sub(/\/$/,""); s=$0; next} {print s $0 "/"}' file 
http://example.com/test/ 
0

短GNU sed的替代:

sed '1{N; s~/*\n\(.*\)~/\1/~;}' file 
http://example.com/test/