![](/img/trans.png)
[英]shell script in unix(in bash shell) for copying a file from one location(i.e a directory), to other, without using cp command at all
[英]UNIX Shell Script remove one column from the file
我有一個如下所示的文件:
Header1:value1|value2|value3|
Header2:value4|value5|value6|
列號未知,我有一個可以返回列號的函數。
我想編寫一個可以從文件中刪除一列的腳本。 例如,刪除第 1 列后,我將得到:
Header1:value2|value3|
Header2:value5|value6|
我使用cut
來實現這一點,到目前為止,我可以在刪除一列但沒有標題后給出值。 例如
value2|value3|
value5|value6|
誰能告訴我如何添加標題? 或者任何命令都可以直接做到這一點? 謝謝。
用管道替換冒號,執行cut
命令,然后再次用冒號替換第一個管道:
sed 's/:/|/' input.txt | cut ... | sed 's/|/:/'
您可能需要調整 cut 命令的列號,以確保不計算標題。
將 ':' 變成 '|',這樣標題是另一個字段,而不是第一個字段的一部分。 您可以在任何生成數據的方式中執行此操作,也可以通過tr ':' '|'
傳遞數據 cut
之前。 然后,您的其余字段將被 +1 抵消,但這應該很容易彌補。
您的問題是 HeaderX 后跟 ' : ' 這不是 ' | ' 您在剪切中使用的分隔符。
你可以先用 : 將你的行分成兩部分,比如“cut -f 1 --delimiter=: YOURFILE”,然后刪除第一列,然后放回標題。
awk 可以處理多個分隔符。 所以另一種選擇是......
jkern@ubuntu:~/scratch$ cat ./data188
Header1:value1|value2|value3|
Header2:value4|value5|value6|
jkern@ubuntu:~/scratch$ awk -F"[:|]" '{ print $1 $3 $4 }' ./data188
Header1value2value3
Header2value5value6
你可以只用sed
來做而不用cut
:
sed 's/:[^|]*|/:/' input.txt
我的解決方案:
$ sed 's,:,|,' data | awk -F'|' 'BEGIN{OFS="|"}{$2=""; print}' | sed 's,||,:,'
Header1:value2|value3|
Header2:value5|value6|
:
用|
-F'|'
告訴awk
使用|
符號作為字段分隔符|
)打印結果行|
與:
不完美,但應該有效。
$ cat file.txt | grep 'Header1' | awk -F"1" '{ print $1 $2 $3 $4}'
這將在單獨的列中打印所有值。 您可以打印任意數量的列。
只需使用 Perl 解決方案:
(根據需要重新排列/刪除字段)
-l 有效地為每個打印語句添加一個換行符
-a 自動拆分模式使用 -F 表達式將每一行拆分為數組 @F
-n 在 -e 代碼周圍添加一個循環
-e 你的 'one liner' 遵循這個選項
$ perl -F[:\|] -lane 'print "$F[0]:$F[1]|$F[2]|$F[3]"' input.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.