簡體   English   中英

沒有AWK的Bash列SED和BASH命令?

[英]Bash Columns SED and BASH Commands without AWK?

我寫了2個差異腳本,但是我遇到了同樣的問題。

問題是用我在args中獲得的文件( $2 )來創建表,而$1是列數。 有點難以解釋,但我將向您展示輸入和輸出。 現在的問題是,我現在不知道如何將每個列保存在差異var中,以便以后可以在HTML代碼中構建它

#printf #TR##TD#$...#/TD##TD#$...#/TD##TD#$..#/TD##/TR##TD#$...

所以輸入看起來像這樣:

Name\tSize\tType\tprobe
bla\t4711\tfile\t888888888
abcde\t4096\tdirectory\t5555
eeeee\t333333\tblock\t6666
aaaaaa\t111111\tpackage\t7777
sssss\t44444\tfile\t8888
bbbbb\t22222\tfolder\t9999

代碼:

c=1
column=$1
file=$2

echo "$( < $file)"| while read Line ; do
Name=$(sed "s/\\\t/ /g" $file | cut -d' ' -f$c,-$column)
printf "$Name \n" 
#let c=c+1
#printf "<TR><TD>$Name</TD><TD>$Size</TD><TD>$Type</TD></TR>\n"
exit 0
done

輸出:

Name Size Type probe
bla 4711 file 888888888
abcde 4096 directory 5555
eeeee 333333 block 6666
aaaaaa 111111 package 7777
sssss 44444 file 8888
bbbbb 22222 folder 9999

這是awk量身定制的工作。 參見以下腳本:

awk -F'\t' '{printf "<tr>";for(i=1;i<=NF;i++) printf "<td>%s</td>", $i;print "</tr>"}' input

<tr><td>bla</td><td>4711</td><td>file</td><td>888888888</td></tr>
<tr><td>abcde</td><td>4096</td><td>directory</td><td>5555</td></tr>
<tr><td>eeeee</td><td>333333</td><td>block</td><td>6666</td></tr>
<tr><td>aaaaaa</td><td>111111</td><td>package</td><td>7777</td></tr>
<tr><td>sssss</td><td>44444</td><td>file</td><td>8888</td></tr>
<tr><td>bbbbb</td><td>22222</td><td>folder</td><td>9999</td></tr>

bash

celltype=th
while IFS=$'\t' read -a columns; do
   rowcontents=$( printf '<%s>%s</%s>' "$celltype" "${columns[@]}" "$celltype" )
   printf '<tr>%s</tr>\n' "$rowcontents"
   celltype=td
done < <( sed $'s/\\\\t/\t/g' "$2")

一些解釋:

  1. IFS=$'\\t' read -a columns從標准輸入讀取一行,僅使用制表符分隔字段,並將每個字段放入數組columns的單獨元素中。 我們更改了IFS以便不會將可能在字段中出現的其他空格視為字段分隔符。

  2. 在從標准輸入讀取的第一行中, <th>元素將由printf行輸出。 復位的值之后celltype在循環體的結束時,所有后續行將由<td>元素。

  3. 設置rowcontents的值時,請利用以下事實:將第一個參數重復多次以消耗所有參數。

  4. 輸入是通過sed命令的進程替換進行的,這需要大量的引用。 首先,整個參數用$'...' ,告訴bash替換轉義字符。 bash將其轉換為文字字符串s/\\\\t/^T/g ,其中我使用^T表示文字ASCII 09制表符。 sed看到此參數時,它會執行自己的轉義替換,因此搜索文本是一個文字反斜杠,后跟一個文字t,並由一個文字制表符替換。

  5. 第一個參數,列數,是不必要的,將被忽略。

  6. 通常,避免while循環中使用while循環,因為您在循環中設置了以后要使用的參數。 在這里,所有變量確實是while循環的局部變量,因此您可以避免進程替換,並根據需要使用管道:

     sed $'s/\\\\\\\\t/\\t/g' "$2" | while IFS=$'\\t' read -a columns; do ... done 

暫無
暫無

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

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