[英]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")
一些解釋:
IFS=$'\\t' read -a columns
從標准輸入讀取一行,僅使用制表符分隔字段,並將每個字段放入數組columns
的單獨元素中。 我們更改了IFS
以便不會將可能在字段中出現的其他空格視為字段分隔符。
在從標准輸入讀取的第一行中, <th>
元素將由printf
行輸出。 復位的值之后celltype
在循環體的結束時,所有后續行將由<td>
元素。
設置rowcontents
的值時,請利用以下事實:將第一個參數重復多次以消耗所有參數。
輸入是通過sed
命令的進程替換進行的,這需要大量的引用。 首先,整個參數用$'...'
,告訴bash
替換轉義字符。 bash
將其轉換為文字字符串s/\\\\t/^T/g
,其中我使用^T
表示文字ASCII 09制表符。 當sed
看到此參數時,它會執行自己的轉義替換,因此搜索文本是一個文字反斜杠,后跟一個文字t,並由一個文字制表符替換。
第一個參數,列數,是不必要的,將被忽略。
通常,避免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.