簡體   English   中英

UNIX Shell 腳本從文件中刪除一列

[英]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.

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