簡體   English   中英

使用awk或sed或cut過濾文本文件?

[英]Filter text file using awk or sed or cut?

我正在嘗試解決此問題。

$ cat test.txt  
server1
ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

我需要這樣的輸出:

$ cat test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Search:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
ec2dd:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com

使用sed

$ sed 'N;s/\n/:/' test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com 

此方法使用兩個sed命令:

  • N從文件中讀取第二行,並將其添加到模式空間。 這樣,模式空間中始終具有連續的兩行。

  • s/\\n/:/從模式空間的兩行之間刪除換行符,並用冒號代替。

使用awk

$ awk 'NR%2==1{name=$1;next} {print name ":" $0;}' test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com 

筆記:

  • NR%2==1{name=$1;next}

    這將讀取第一行和所有后續的奇數行,並將第一個字段分配給變量name 然后,它跳過其余命令,並跳轉到next行重新開始。

  • print name ":" $0

    在偶數行上,這將打印名稱,冒號和當前行。

使用純殼

while read name; read line
do
        printf "%s:%s\n" "$name" "$line"
done <test.txt

在這里,從text.txt中將一行讀入變量name然后將另一行讀入變量line 然后將這兩個標記之間用冒號打印。

您可以簡單地使用paste命令,

paste -d: - - < file

通過Perl,

perl -pe 's/\n/:/g if $.%2==1' file

$. Perl中的NR與awk中的NR相似。 因此,它僅采用奇數行並將換行符替換為:僅在特定行上。

這個awk可以做到,但是如果您不完全了解getline ,請小心。

awk '{a=$1;getline;print a":"$1}' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

這是一種更好的方法:

awk 'ORS=NR%2?":":RS' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM