データを垂直形式でファイルに保存するシナリオがあります。
以下はデータです
143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28
次のロジックを適用した後、私のデータは次の形式です。
cat demo.txt |rev| cut -d'|' -f3-|rev|cut -d'|' -f2-
以下のように必要な出力を提供しました。
2345|3456|4567|2345|3457
ところで、問題は、目的の出力データを垂直形式でテキストファイルに保存したいということです。
以下のファイルと同様に
2345
3456
4567
2345
3457
答え1
tr '|' '\n'
各パイプを改行文字に変換してトリックを実行する必要があります。
echo "143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28" | tr '|' '\n'
あるいは、あなたの場合にあなたが探しているものかもしれません。
cat file | tr '|' '\n' > newfile
答え2
複数の行とさまざまな数のフィールドを処理するには、col1と最後の2つの列を削除し、残りの列を垂直に配置します。
awk '-F|' '{ for (f = 2; f <= NF - 2; ++f) print $(f); }' data.txt
答え3
元のデータとGNUの使用head
:
$ tr '|' '\n' <demo.txt | head -n -2
143
2345
3456
4567
2345
3457
このtr
コマンドは単に|
- 文字を改行文字に変更します。標準入力からのみ読み取るため、tr
標準入力にリダイレクトする必要があります。
GNUに負の行が与えられると、head
データの末尾からその数を削除します。
または、単一の呼び出しで次の操作を行いますsed
。
$ sed 's/\(|[^|]*\)\{2\}$//; y/|/\n/' demo.txt
143
2345
3456
4567
2345
3457
ここで、置換は2文字と各文字の後の文字列を|
一致させて最後の2つの区切りフィールドを削除し、コマンドは残りの各フィールドを改行に変更します(最初の解決策と同様)。|
y
|
tr
おそらく:を使用すると、より読みやすくなりますsed -E
。 (|
今 - 文字の1つをエスケープする必要があることに注意してください。)
sed -E 's/(\|[^|]*){2}$//; y/|/\n/' demo.txt