各医療機関内の病床の確保状況をシェルで変換

自分で作った

curl -s https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00335.html \
| xmllint --html --xpath '//a[contains(@href,".csv")]/@href' - \
| xargs -n 1 \
| cut -d= -f2 \
| sed 's;^;https://www.mhlw.go.jp/;;' \
| xargs -n 1 curl -L#O

curl -s https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00327.html \
| xmllint --html --xpath 'string(//a[contains(@href,".csv")]/@href)' - \
| sed 's;^;https://www.mhlw.go.jp/;;' \
| xargs -n 1 curl -L#O

cat *.csv | iconv -c -f SHIFT_JIS -t UTF-8 > result

ぱぴろんちゃん さんのコード

# ダウンロードするCSVファイルのURLリスト作成
(
curl -s https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00335.html | xmllint --html --xpath '//a[contains(@href,".csv")]/@href' - 2> /dev/null | xargs -n 1 | cut -d= -f2
curl -s https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00327.html | xmllint --html --xpath 'string(//a[contains(@href,".csv")]/@href)' 2> /dev/null -
) > download/filelist

(
cd download
rm -f *.csv result_head result_body

# CSVファイルのダウンロード
cat filelist | sed 's;^;https://www.mhlw.go.jp/;;' | xargs wget

# 説明文を取り除いて、URLリスト順に連結。ファイル名日付順になってないのに注意。
cat filelist | awk '{print $NF}' FS=/ | xargs awk '22<=FNR{print FILENAME,FNR,$0}' FS=, RS='\r\n' OFS=, ORS='\r\n' |

# 列名の改行を削除して、改行とダブルクォーテーションを削除
awk '{for(i=1;i<=NF;i++){gsub("\n","",$i)}print}'  FS=, RS='\r\n' OFS=, ORS='\r\n' | tr -d '"' |

# 実績日のフォーマットを、固定長のYYYY/MM/DDにする
# 実績日が"44566"のようになってる場合もあるのに注意
awk '$10~/[0-9]+\/[0-9]+\/[0-9]+/{split($10,date,"/");$10=sprintf("%04d/%02d/%02d", date[1], date[2], date[3])}{print}' FS=, RS='\r\n' OFS=, ORS='\r\n' > result_body

# ヘッダー抜き出し
ls *.csv | head -n 1 | xargs awk 'FNR==21{print "ファイル名","ファイル行番号",$0}' FS=, RS='\r\n' OFS=, ORS='\r\n' > result_head
)

# ヘッダーとデータボディを連結
cat download/result_head download/result_body | nkf > result.csv
2> /dev/null

でエラーを破棄が標準出力にでないみたい

{print}は{print $0}と同じ

cat filelist | awk '{print $NF}' FS=/ | xargs awk '22<=FNR{print FILENAME,FNR,$0}' FS=, RS='\r\n' OFS=, ORS='\r\n'

FILENAME 現在処理しているファイルの名前

FNR ファイル別行番号

NF 各行の列数

FS フィールドの区切り

RS レコードの区切り

OFS 出力時のフィールドの区切り(デフォルトは空白)

ORS 出力時のレコードの区切り(デフォルトは改行)

atmarkit.itmedia.co.jp

awk '{for(i=1;i<=NF;i++){gsub("\n","",$i)}print}'  FS=, RS='\r\n' OFS=, ORS='\r\n' | tr -d '"'

gsub 全ての置換対象文字列を置換

sub 最初の置換対象文字列一回のみ置換

tr -d '"' ダブルクォーテーションを削除