![](/img/trans.png)
[英]How can I get my bash script to remove the first n and last n lines from a variable?`
[英]How to cut first n and last n columns?
我怎么能切斷從制表符分隔的文件中的第一n和最后的n列?
我試着用這個來切割第一個n列。 但我不知道將第一列和最后 n 列結合起來
cut -f 1-10 -d "<CTR>v <TAB>" filename
Cut 可以在-f
取幾個范圍:
最多 4 列和從 7 列開始:
cut -f -4,7-
或對於字段 1、2、5、6 和從 10 開始:
cut -f 1,2,5,6,10-
等
你問題的第一部分很簡單。 正如已經指出的, cut 接受省略列范圍的開始或結束索引,將其解釋為“從開始到第n列(包含)”或“從第n列(包含)到結束”,分別為:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
它還支持組合范圍。 如果你想要,例如,一行 7 列中的前 3 列和最后 2 列:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
但是,您的問題的第二部分可能會有點棘手,具體取決於您期望的輸入類型。 如果“最后n列”的意思是“最后n列(無論它們在整個行中的索引如何)”(即因為您不一定知道要提前找到多少列),那么遺憾的是這不是可以單獨使用cut
來完成。 為了有效地使用cut
來提取每行的“最后n列”,必須事先知道每行存在的總列數,並且每行包含的列數必須一致。
如果您不知道每行中可能存在多少“列”(例如,因為您正在處理不是嚴格表格的輸入),那么您將不得不使用類似awk
東西。 例如,要使用awk
從每一行輸入中提取最后 2 個“列”(awk 將它們稱為字段,每行的數量可能不同):
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d
您可以使用以下方法進行剪切,
-d:分隔符,-f 用於字段
\\t 用於制表符分隔的字段
cut -d$'\t' -f 1-3,7-
要使用 AWK 截斷第一個和最后一個字段:
awk '{$1 = ""; $NF = ""; print}' inputfile
不幸的是,這留下了字段分隔符,所以
aaa bbb ccc
變成
[space]bbb[space]
要做到這一點,請使用 kurumi 的答案,它不會留下額外的空間,而是以特定於您的要求的方式:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
這也解決了該答案中的幾個問題。
概括地說:
awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
然后,您可以通過更改命令開頭的變量分配來更改要在開頭或結尾跳過的字段數。
您可以為此使用 Bash:
while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
請嘗試以下操作:
echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""
您可以使用awk,例如,截斷第1、第2和最后3列
awk '{for(i=3;i<=NF-3;i++} print $i}' file
如果你有一種編程語言,比如 Ruby (1.9+)
$ ruby -F"\t" -ane 'print $F[2..-3].join("\t")' file
使用
cut -b COLUMN_N_BEGINS-COLUMN_N_UNTIL INPUT.TXT > OUTPUT.TXT
如果文本文件中有“標簽”,則-f
不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.